※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 14729번 문제인 칠무해이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/14729 

 

14729번: 칠무해

조(Joe)는 중앙대학교 교수이고, 논리회로 설계 과목을 담당하고 있다. 그는 수업을 하면서 7명의 학생을 제외한 나머지 학생들에게 좋은 학점을 주겠다고 약속을 하였다. Joe 교수님을 돕기 위해

www.acmicpc.net

주어지는 수들 중 가장 작은 일곱 개의 수를 찾아 출력하는 문제이다.

 

순서를 알아야하는 수는 작은 일곱 개의 수가 전부이므로, 매 수를 받을 때마다 이 수가 가장 작은 7개의 수에 포함될 수 있는지 확인하고 이보다 작은 수들의 순위를 하나씩 미루는 것으로 문제를 해결할 수 있다.

 

아래의 구현은 실수오차에 걱정이 없는, 숫자를 문자열로 구현한 코드이다. 아래와 같은 구현을 할 때, 모든 문자열을 저장하면 메모리초과가 날 수 있음에 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

string ans[7] = { "999.999","999.999","999.999","999.999","999.999","999.999","999.999" };

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N; cin >> N;
	while (N--) {
		string s; cin >> s;
		if (s[2] == '.') s = "0" + s;
		else if (s[1] == '.') s = "00" + s;
		for (int i = 0; i < 7; i++) {
			if (s < ans[i]) {
				for (int j = 6; j > i; j--) {
					ans[j] = ans[j - 1];
				}
				ans[i] = s;
				break;
			}
		}
	}

	for (int i = 0; i < 7; i++) {
		if (ans[i].substr(0, 2) == "00") cout << ans[i].substr(2, 5) << '\n';
		else if (ans[i][0] == '0') cout << ans[i].substr(1, 6) << '\n';
		else cout << ans[i] << '\n';
	}
}
728x90

+ Recent posts