오늘 문제는~~
문제
https://www.acmicpc.net/problem/2309
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
일곱 난쟁이~~~
음... 어떻게 풀어야할지 고민해보니...
하나하나 다 확인해야할 것 같다.
일단, 배열에 다 입력받고 정렬을 미리한 후 그 합을 구해서 2개씩 빼주어 합이 100이 되는지 확인해야겠다.
// 틀린 코드
#include <iostream>
#include <algorithm>
using namespace std;
int n,temp;
int sum = 0;
int sevenshort[9];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for (int i = 0; i < 9; i++) {
cin >> sevenshort[i];
sum += sevenshort[i];
}
sort(sevenshort, sevenshort + 9);
for (int i = 0; i < 8; i++) {
for (int j = i + 1; j < 9; j++) {
temp = sum - (sevenshort[i] + sevenshort[j]);
if (temp == 100) {
sevenshort[i] = 0;
sevenshort[j] = 0;
break;
}
}
}
for (int i = 0; i < 9; i++) {
if (sevenshort[i] != 0) {
cout << sevenshort[i] << "\n";
}
}
return 0;
}
힝... 이번에도 예제 출력처럼 맞게 출력돼서 기대했는데... 틀렸다...
왜 틀렸는지 코드를 보다가 이중 for 문에 break하는 부분에서 안쪽의 for문만 빠져나가서 그런가라는 생각이 들어 출력을 그 안에서 해주고 return을 해주기로 했다. 그렇게 작성을 해보니
#include <iostream>
#include <algorithm>
using namespace std;
int n,temp;
int sum = 0;
int sevenshort[9];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for (int i = 0; i < 9; i++) {
cin >> sevenshort[i];
sum += sevenshort[i];
}
sort(sevenshort, sevenshort + 9);
for (int i = 0; i < 8; i++) {
for (int j = i + 1; j < 9; j++) {
temp = sum - (sevenshort[i] + sevenshort[j]);
if (temp == 100) {
sevenshort[i] = 0;
sevenshort[j] = 0;
for (int i = 0; i < 9; i++) {
if (sevenshort[i] != 0) {
cout << sevenshort[i] << "\n";
}
}
return 0;
}
}
}
return 0;
}
오 ㅎㅎ 맞았다
그런데 뭔가 지저분한 것 같기도...
다른 사람은 어떻게 했는지 봐야겠다.
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int tall[10];
int sum = 0;
for (int i = 0; i < 9;i++){
cin >> tall[i];
sum += tall[i]; // 전체 합
}
sort(tall, tall + 9); // 미리 정렬
for (int i = 0; i < 8; i++){
for (int j = i + 1; j < 9;j++){
if(sum-(tall[i]+tall[j]) == 100){
// 2명을 뺀 값의 합이 100이 되면
for (int z = 0; z < 9;z++){
if(z != i && z != j){ // 2명 빼고 출력
cout << tall[z] << '\n';
}
}
return 0;
}
}
}
return 0;
} //8 min
출처: https://hagisilecoding.tistory.com/42
흠... 비슷하게 풀었는데 이 코드가 훨씬 깔끔하네...ㅎㅎ
이 분은 빼야하는 2명을 0으로 만든 것이 아닌 해당 인덱스를 빼고 출력해주었다.
난 처음에 출력하는 부분을 밖에 빼놓아서 0으로 만들었지만 for 문 안에 출력하는 부분을 넣으니 인덱스를 사용할 수 있어 더 깔끔하게 코드를 작성할 수 있었다.
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int arr[9];
int sum=0;
for (int i = 0; i < 9; i++) {
cin >> arr[i];
sum += arr[i];
}
sort(arr, arr + 9);
for (int i = 0; i < 8; i++) {
for (int j = 1; j < 9; j++) {
if (sum - arr[i] - arr[j] == 100) {
for (int k = 0; k < 9; k++) {
if (k == i || k == j) continue;
cout << arr[k] << '\n';
}
return 0;
}
}
}
return 0;
}
출처: https://ya-ya.tistory.com/97 [기록노트:티스토리]
이 분은 continue를 이용해 해당 인덱스면 넘어가도록 만들어주었다.
+ 추가)
이건 내가 궁금해서 찾아본 것이다.
다중 반복문을 한번에 탈출하는 방법...
#include <iostream>
#include <algorithm>
using namespace std;
int n,temp;
int sum = 0;
int sevenshort[9];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for (int i = 0; i < 9; i++) {
cin >> sevenshort[i];
sum += sevenshort[i];
}
sort(sevenshort, sevenshort + 9);
for (int i = 0; i < 8; i++) {
for (int j = i + 1; j < 9; j++) {
temp = sum - (sevenshort[i] + sevenshort[j]);
if (temp == 100) {
sevenshort[i] = 0;
sevenshort[j] = 0;
goto EXIT;
}
}
}
EXIT:
for (int i = 0; i < 9; i++) {
if (sevenshort[i] != 0) {
cout << sevenshort[i] << "\n";
}
}
return 0;
}
이렇게 goto를 이용하여 지정한 위치(레이블)로 바로 이동하게 하는 것이다.
이렇게 하면~~ 정답!!
다른 방법도 있으니 여기를 참고하면 된다.
[참고] https://code-getset.tistory.com/31
'백준 > C++' 카테고리의 다른 글
[C++] 백준 2587번 대표값2 (2) | 2023.12.17 |
---|---|
[C++] 백준 1931번 회의실 배정 (2) | 2023.12.16 |
[C++] 백준 1920번 수 찾기 (0) | 2023.12.14 |
[C++] 백준 11399번 ATM (2) | 2023.12.13 |
[C++] 백준 10825번 국영수 (2) | 2023.12.12 |