문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
풀이
#include <stdio.h>
#include <string.h> //strlen 함수를 위한 것
int main() {
int arr[26];
char S[100];
scanf("%s", S);
int i, j;
for (int i = 0; i < 26; i++)
arr[i] = -1;
for (i = 97; i <= 122; i++)
{
for (j = 0; j < strlen(S); j++)
{
if (S[j] == i)
{
arr[S[j] -'a'] = j;
break;
}
}
}
for (i = 0; i < 26; i++) {
printf("%d ", arr[i]);
}
return 0;
}
코드 하나하나 뜯어보기
이번 문제는 이 밑에 있는 코드가 가장 핵심이라고 할 수있으니, 이것을 한번 체크해보자
for (i = 97; i <= 122; i++)
{
for (j = 0; j < strlen(S); j++)
{
if (S[j] == i)
{
arr[S[j] -'a'] = j;
break;
}
}
}
1)왜 첫번째 for 문의 i는 97부터~122 인가?
ASCII 코드에서 a = 97, 차례 대로 가고 z = 122 이다. 즉 저 for 문은 알파벳을 순서대로 확인해주기 위해 작성한 것이다.
2)두번쨰 for 문은 무엇을 의미하는가?
예를들어 i = 97 (a일때 ) 를 기준으로 입력받은 문자열 배열을 첫번째 인수부터 순서대로 확인해주는 것이다.
3) arr[[S[j]-'a'] = j ; 는 무엇을 의미하는가?
여기서 S[j] 는 if(S[j] == i ) 문 안에 있다. 따라서 s[j] == i 이어야 한다.
예를 들어 입력값 'baekjoon' 에서 i =97 일 때, s[j] = 97 이므로 j = 1(두번째 자리에 a가 있음 )가 될 것이다. s[j]를 우리가 문자열 인덱스(int arr)와 연관지어 생각해보자. 이제 우리가 원하는 것은 arr[0] = 1이 되는 것이다.
따라서 s[1] -'a' = 0 이 되도록 하기 위해 'a'를 넣어준 것이다.
(s[1] = 97 이고 문자 'a' = 97이다. 따라서 97 -97 = 0)
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 백준 1157번 단어공부 해설 (4) | 2021.09.09 |
---|---|
C언어 백준 2675번 문자열 반복 해설 (scanf 오류 해결) (0) | 2021.09.08 |
C언어 백준 10809 번 (2) | 2021.09.04 |
C언어 백준 11720 해설 (1) | 2021.09.03 |
C언어 1065번 해설 한수 (0) | 2021.09.02 |