※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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
'BOJ' 카테고리의 다른 글
[BOJ 5588 // C++] 별자리 찾기 (0) | 2022.06.19 |
---|---|
[BOJ 14731 // C++] 謎紛芥索紀 (Large) (0) | 2022.06.19 |
[BOJ 5586 // C++] JOI와 IOI (0) | 2022.06.19 |
[BOJ 5587 // C++] 카드 캡터 상근이 (0) | 2022.06.19 |
[BOJ 14730 // C++] 謎紛芥索紀 (Small) (0) | 2022.06.19 |