문제
꿍은 도비에게 영어단어들을 제시한 후 어떤 단어가 대소문자를 구분하지 않고 사전순으로 가장 앞서는지 맞추면 양말을 주어 자유를 얻게해준다고 하였다.
하지만 인성이 좋지 않은 꿍은 사실 그러고 싶지 않았기 때문에 대소문자를 마구 섞어가며 단어들을 제시했다. 예를 들어, apPle은 Bat보다 앞서지만 AnT보다는 뒤에 있는 단어다.
도비에게 희망은 여러분뿐이다! 여러분이 도비에게 자유를 선물해주도록 하자!
입력
각 테스트케이스는 정수 n (2 ≤ n ≤ 1000) 으로 시작하며 주어지는 단어의 개수를 뜻한다.
다음 각 n줄은 길이가 최대 20인 단어가 주어지며 대소문자의 구분을 없앴을 때 똑같은 단어는 주어지지 않는다.
마지막 입력은 0이 주어진다.
출력
각 줄에 각 테스트케이스에서 사전상 가장 앞서는 단어를 출력한다.
풀이 과정
첫 번째 문장을 먼저 입력 받고, 이후 입력되는 문장들이 사전순으로 더 앞서는지를 비교하며 가장 앞서는 단어를 찾는다.
단, 주의해야 할 점은 대소문자 구분을 하지 않는다는 점이다. 대문자를 소문자로 바꾸거나 소문자를 대문자로 바꾸어 비교를 해야 하며, 원래 단어 형태를 유지해야 한다는 점이 주요 포인트이다.
C
#include <stdio.h>
#include <string.h>
int doby_strcmp(char* a, char* b) {
int idx = 0;
int a_len = strlen(a);
int b_len = strlen(b);
while (idx < a_len || idx < b_len) {
int a_so = 0;
int b_so = 0;
if ('a' <= a[idx] && a[idx] <= 'z') a_so = 32; // 소문자 -> 대문자
if ('a' <= b[idx] && b[idx] <= 'z') b_so = 32; // -32
// a_so 가 0이면, a[idx] - 0이 되어 대문자 유지
// a_so 가 32이면, a[idx] - 32이 되어 소문자가 대문자가 됨.
if (a[idx] - a_so < b[idx] - b_so) return 1; // a가 사전순으로 더 앞선다.
else if (a[idx] - a_so > b[idx] - b_so) return 0; // b가 사전순으로 더 앞선다.
idx += 1;
}
return 0; // 똑같다.
}
int main(void) {
while(1) {
int n;
scanf("%d", &n);
if (n == 0) break;
char min_word[25];
char tmp[25];
scanf("%s", min_word);
for (int i = 0; i < n - 1; i++) {
scanf("%s", tmp);
if (doby_strcmp(tmp, min_word)) strcpy(min_word, tmp);
}
printf("%s\n", min_word);
}
return 0;
}
Python
import sys
input = sys.stdin.readline
while True:
n = int(input().rstrip())
if n == 0: break
arr = [input().rstrip() for _ in range(n)]
new_arr = []
for i in range(n):
new_arr.append([arr[i].upper(), i])
new_arr.sort(key=lambda x:x[0])
print(arr[new_arr[0][1]])
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 1094 : 막대기 ( SILVER 5 ) / C, Python (0) | 2023.11.16 |
---|---|
[ BOJ ] 12833 : XORXORXOR ( BRONZE 1 ) / C, Python (0) | 2023.11.16 |
[ BOJ ] 10769 : 행복한지 슬픈지 ( BRONZE 1 ) / C, Python (0) | 2023.11.14 |
[ BOJ ] 2309 : 일곱 난쟁이 ( BRONZE 1 ) / C, Python (0) | 2023.11.14 |
[ BOJ ] 1543 : 문서 검색 ( SILVER 5 ) / C, Python (0) | 2023.11.14 |