coding_test/BAEKJOON
백준 10809번 C언어 풀이
CodeJin
2021. 8. 7. 21:55
https://www.acmicpc.net/problem/10809
10809번: 알파벳 찾기
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출
www.acmicpc.net
입력받은 알파벳의 배열에서 각 알파벳이 처음으로 등장하는 위치를 출력하는 문제.
이전에 푼 실버티어의 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]);
}
}
}