https://www.acmicpc.net/problem/10809
소문자로 된 단어들에서 A~Z까지의 알파벳이 처음 등장하는 위치를 공백으로 구분하여 출력합니다.
알파벳이 단어에 없는 경우, -1을 출력합니다.
예제 입력
baekjoon
예제 출력
1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
해결 방법
char 자료형을 이용하여 문자를 저장할 때, char ch = 'A'와 같이 보이는 것으로는 문자 자체를 저장한다고 생각 할 수 있지만, 실제로는 그 문자에 대응하는 아스키 코드를 저장합니다. A의 아스키 코드는 65이므로, ch 변수에는 정수 65가 저장된다고 생각하면 편합니다. 이 개념을 이용하여 해결할 것입니다.
코드
#include <stdio.h>
int main()
{
char str[100], pos;
scanf("%s", str);
for (int asc = 'a'; asc <= 'z'; asc++){
/* 문자를 저장하는 것이 아닌, 문자에 대응하는 아스키 코드(정수)를 저장하므로 int 자료형에
문자를 대입할 수 있습니다. 자주 쓰게 될 것이므로 기억합시다. */
pos = 0; // 배열의 첫 번째부터 건드릴 것이므로, 0으로 초기화합니다.
while (str[pos] != NULL){
if (str[pos] == (char) asc) break;
pos++;
}
if (str[pos] == (char)asc) printf("%d ", pos);
else printf("-1 ");
}
}
코드가 작동하는 방식은 다음과 같습니다.
(a를 str[100] = baekjoon에서 찾는다고 가정합니다.)
pos = 0으로 초기화하고, str[pos]와 같이 사용합니다.
str[0]은 b, a와 다르므로 pos++를 이용하여 pos에 1을 더하여 1로 만들어줍니다.
str[1]은 a, a와 같으므로 break 문을 이용하여 반복문에서 빠져나오고, (알파벳이 발견된)현재 위치를 출력합니다.
만일 찾지 못한 경우, 단어의 어느 위치의 글자도 알파벳과 같지 않은 것이니
if문은 늘 거짓이 될 것이므로 -1을 출력하게 됩니다.
이 과정을 a부터 z까지 반복합니다.
'코딩 > 백준' 카테고리의 다른 글
[백준][C] 1152. 단어의 개수 (1) | 2022.10.03 |
---|---|
[백준][C] 2675. 문자열 반복 (0) | 2022.10.03 |
[백준][C] 11720. 숫자의 합 (0) | 2022.10.02 |
[백준][C] 11654. 아스키 코드 (0) | 2022.10.02 |
[백준][C] 4344. 평균은 넘겠지 (0) | 2022.10.02 |