[백준/C++] 2204 - 도비의 난독증 테스트

정승우·2021년 2월 16일
0

[백준/C++] BOJ 공부

목록 보기
5/25

문제링크: https://www.acmicpc.net/problem/2204

문제


꿍은 도비에게 영어단어들을 제시한 후 어떤 단어가 대소문자를 구분하지 않고 사전순으로 가장 앞서는지 맞추면 양말을 주어 자유를 얻게해준다고 하였다.

하지만 인성이 좋지 않은 꿍은 사실 그러고 싶지 않았기 때문에 대소문자를 마구 섞어가며 단어들을 제시했다. 예를 들어, apPle은 Bat보다 앞서지만 AnT보다는 뒤에 있는 단어다.

도비에게 희망은 여러분뿐이다! 여러분이 도비에게 자유를 선물해주도록 하자!

입력


각 테스트케이스는 정수 n (2 ≤ n ≤ 1000) 으로 시작하며 주어지는 단어의 개수를 뜻한다.

다음 각 n줄은 길이가 최대 20인 단어가 주어지며 대소문자의 구분을 없앴을 때 똑같은 단어는 주어지지 않는다.

마지막 입력은 0이 주어진다.

출력


각 줄에 각 테스트케이스에서 사전상 가장 앞서는 단어를 출력한다.

풀이


#include <iostream>
#include <algorithm>
#include <vector>

bool fast(std::string a, std::string b) {
	for (int i = 0; i < a.size(); i++) {
		if (a[i] >= 'a' && a[i] <= 'z') {
			a[i] -= 32;
		}
	}

	for (int i = 0; i < b.size(); i++) {
		if (b[i] >= 'a' && b[i] <= 'z') {
			b[i] -= 32;
		}
	}

	if (a.compare(b) > 0) {
		return false;
	}
	return true;
}

int main() {
	std::ios::sync_with_stdio(false);
	std::cout.tie(NULL);
	std::cin.tie(NULL);

	int N; std::cin >> N;
	
	while (N != 0) {
		std::vector<std::string> v(N);

		for (int i = 0; i < N; i++) {
			std::string s; std::cin >> s;
			v[i] = s;
		}

		std::sort(v.begin(), v.end(), fast);

		std::cout << v[0] << "\n";

		std::cin >> N;
	}

	return 0;
}

문자열을 소문자면 소문자, 대문자면 대문자로 바꿔서 크기를 비교하는 함수를 만들어
sort하면 끝이다. 풀이 자체는 진짜 별 것 없는 문제다.

노트


처음에는 main()에서 for문을 돌려 끝낼 생각이었으나, 코드가 지저분 해졌다.
그래서 사전 순서를 비교하는 함수를 밖으로 빼낸 후, vector에 담아 sort해줬더니
쉽게 해결되는 문제였다.

문제만 보고 쉽다고 코드를 막 짜지 말고 구상을 해놓고 구조적으로 쉽게 짜는 연습을 해야겠다.

profile
Computer Science & Engineering 19

0개의 댓글