본문 바로가기

백준/C++

[C++] 백준 2309번 일곱 난쟁이

728x90

 

오늘 문제는~~

 

문제

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

 

 

728x90

'백준 > 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