https://www.acmicpc.net/problem/10809
입력받은 알파벳의 배열에서 각 알파벳이 처음으로 등장하는 위치를 출력하는 문제.
이전에 푼 실버티어의 15596번이나 4673번이랑 동급, 혹은 그 이상으로 어려웠다.
각설하고, 맨 처음에는 배열에 한 글자씩 접근해서 26개의 조건문을 쓰려고 했다가, 그런 의도로 낸 문제는 아닌 것 같아 다른 방법을 생각해보았다.
답은 같은 단계별 문제 풀이에서 아스키코드 문제와 (https://www.acmicpc.net/problem/11654) 이를 이용하여 풀었던 문제(https://www.acmicpc.net/problem/11720, https://codejin.tistory.com/4)에서 영감을 받았다.
알파벳의 아스키코드역시 a부터 1씩 증가하는 형태이므로, 알파벳으로 된 단일문자에서 'a'의 아스키코드만큼 뺀 값을 정수형 변수에 넣으면 a부터 z까지 각각 0~25에 매칭할 수 있다. 이를 이용하여 풀이하였다.
#include <stdio.h>
int main(){
char S[100]; // 입력받을 문자열
int ascii; // 알파벳을 아스키코드를 이용한 숫자로 저장할 변수
int alpha[26] = {0,}; // 알파벳 위치에 대응하는 배열
int idx = 0; // 반복 인자
int first; // 맨 첫글자를 저장할 변수
scanf("%s", S);
while (S[idx] != '\0'){
ascii = S[idx] - 'a'; // 알파벳을 숫자로 변환한다
first = idx == 0 ? ascii : first; // 맨 처음에 위치하는 알파벳
alpha[ascii] = alpha[ascii] == 0 ? idx : alpha[ascii]; // 알파벳 위치에 대응하는 요소에 맨 처음 위치 저장
if (ascii == first) { // 맨 처음 등장하는 단어가 그 다음 위치의 숫자로 바뀔 수 있으므로 0으로 수정하여 이를 방지한다
alpha[ascii] = 0;
}
idx++;
}
for (int i=0; i<26; i++) {
if (alpha[i] == 0 && i != first) { // 요소의 값이 0이면서, 동시에 첫글자가 아닌 경우
printf("-1 ");
} else {
printf("%d ", alpha[i]);
}
}
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 1157번 C언어 풀이 (0) | 2021.08.10 |
---|---|
백준 2675번 C언어 풀이 (0) | 2021.08.10 |
백준 1065번 C언어 풀이 (0) | 2021.08.06 |
백준 4673번 C언어 풀이 (0) | 2021.08.06 |
백준 15596번 C언어 풀이 (0) | 2021.08.05 |