enginner_s2eojeong

C++[baekjoon] 2309번: 일곱 난쟁이 본문

Algorithm/Baekjoon

C++[baekjoon] 2309번: 일곱 난쟁이

_danchu 2024. 5. 5. 21:15

백준 2309번

[1차 코드]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int height[9], sum=0;
    for(int i=0; i<9; i++){
        cin >> height[i];
        sum+=height[i];
    }
    
    sort(height, height+9);
    int i, j, I, J, t=0;
    for(int i=0; i<8; i++){
        for(int j=i+1; j<9; j++){
            if(sum-height[i]-height[j]==100){
                t=1;
                I=i;
                J=j;
                break;
            }
        }
        if(t) break;
    }

    vector<int> arr;
    for(int k=0; k<9; k++){
        if(k==I || k==J) continue;
        else arr.push_back(height[k]);
    }
    for(int k=0; k<7; k++){
        cout << arr[k] << " ";
    }
    
}

 

[해설]

한국정보올림피아드 초등부 문제였다는데 내가 아직 코린이라 처음엔 틀린 답이 계속 나왔었다... 흑흑

9명의 난쟁이들의 키를 for문에서 입력값으로 받아 height[] 배열에 저장과 동시에 sum에도 누적합을 구해놓았다. 이후 height 배열을 sort를 사용해서 오름차순으로 정렬하고 키의 합이 100이 되는 일곱 난쟁이들의 키만 출력해야하므로 sum에서 특정 2개의 값을 뺐을 때 100이 되고 그때 해당 값들의 index을 각각 I, J에 저장했다. 그러고 해당 index의 값들만 건너뛴 채 나머지 일곱 난쟁이들의 height값만 새로운 동적 배열 arr에 push_back으로 삽입했다.

 

Q. 근데 처음에는 for문을 돌다가

if(sum-height[i]-height[j]==100)

를 만족하는 i와 j가 자동으로 저장된다고 생각해서 따로 변수 I, J를 선언하지 않았는데 그냥 i, j를 이용하니까 틀린 값이 나왔었다...

그래서 I,J에다가 i,j를 각각 저장해놓고 I,J를 사용해서 출력했다.

 

[해결]

내가 int i, j로 변수 선언을 해놓고 for문 안에서 새롭게 다시 선언(int i=0; i<8; i++)을 했던 것이 문제였다. 하핳..

사실 약간 헷갈리긴해서 그냥 되도록이면 변수를 다르게 쓰는게 최선의 방법일 듯 하다. 

 

 

[수정 코드]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int height[9], sum=0;
    for(int i=0; i<9; i++){
        cin >> height[i];
        sum+=height[i];
    }
    
    sort(height, height+9);
    int i, j, I, J, t=0;
    for(i=0; i<8; i++){ // 앞서 int i, j로 선언했기 때문에 그냥 i=0, j=0으로 바로 시작
        for(j=i+1; j<9; j++){
            if(sum-height[i]-height[j]==100){
                t=1;
                break;
            }
        }
        if(t) break;
    }

    vector<int> arr;
    for(int k=0; k<9; k++){
        if(k==i || k==j) continue;
        else arr.push_back(height[k]);
    }
    for(int k=0; k<7; k++){
        cout << arr[k] << " ";
    }
    
}

 

출처: https://www.acmicpc.net/problem/2309