[BOJ_step_07] 문자열 07 ~ 10
문자열
문자열을 다루는 문제들을 해결해 보자.
상수(2908)
문제풀이
주어지는 세 자리 숫자를 문자열로 입력받아 각 자릿 수에 대한 연산을 거꾸로 하여 두 수 a, b중 큰 수를 출력한다.
void solution_2908()
{
char Num[2][4];
int a = 0, b = 0, c = 1;
scanf("%s", Num[0]);
scanf("%s", Num[1]);
for (int i = 0; i < 3; i++) {
a += c * (Num[0][i] - 48);
b += c * (Num[1][i] - 48);
c *= 10;
}
printf("%d", a > b ? a : b);
}
다이얼(5622)
문제풀이
A
를 0 이라고 생각하고 ABC
는 모두 1 + 2
의 값(다이얼 2 부분은 3초이다)을 가져야 한다. 다이얼 8 전 까지는 모두 3개씩 가지고 있으므로 else t = (S[i] - 65) / 3 + 3;
이와 같이 계산 해주고 나머지 부분을 원하는 초 만큼 계산해주면 된다.
void solution_5622()
{
char S[16];
int Time = 0;
scanf("%s", S);
int i = 0;
while (S[i]) {
int t;
if (S[i] >= 'P'&&S[i] <= 'S') t = 8;
else if (S[i] >= 'T'&&S[i] <= 'V')t = 9;
else if (S[i] >= 'W'&&S[i] <= 'Z')t = 10;
else t = (S[i] - 65) / 3 + 3;
Time += t;
i++;
}
printf("%d", Time);
}
크로아티아 알파벳(2941)
문제풀이
규칙에 맞는 문자열을 저장해놓고 주어진 문자열에서 해당 문자를 찾는 문제다.
int Search_2941(char *a, char *b) {
int cnt = 0, i = 0;
while (1) {
if (!b[i]) return cnt;
if (a[i] != b[i]) return 0;
if (b[i] && a[i] == b[i]) {
i++;
cnt++;
}
}
}
void solution_2941()
{
char S[101];
char CroatiaAp[8][4] = {
{'c','='}, {'c','-'}, {'d','z','='}, {'d','-'},
{'l','j'}, {'n','j'}, {'s','='}, {'z','='}
};
scanf("%s", S);
int i = 0, answer = 0;
while (S[i]) {
int n = 0;
for (int k = 0; k < 8; k++) {
n = Search_2941(&S[i], CroatiaAp[k]);
if (n > 0) {
answer++;
i += n;
break;
}
}
if (n == 0) {
answer++;
i++;
}
}
printf("%d\n", answer);
}
그룹단어 체커(1316)
문제풀이
문자열 중에서 한 번 이상 나왔던 문자가 다른 문자가 나온 후 또 나오는지 안나오는지 확인하는 문제다.
void solution_1316()
{
int N, Cnt = 0;
char S[101];
bool Check[26];
memset(Check, 26, 0);
scanf("%d", &N);
while (N--) {
int i = 0;
for (int j = 0; j < 26; j++) Check[j] = false;
scanf("%s", S);
while (S[i]) {
int n = S[i] - 97;
if (Check[n] && S[i] != S[i - 1])break;
if (!Check[n]) Check[n] = true;
i++;
}
if (S[i] == '\0')Cnt++;
}
printf("%d\n", Cnt);
}
댓글남기기