본문 바로가기
프로그래밍/C++ :: 백준

[C/C++] 백준 10811 : 바구니 뒤집기 / 10871 : X보다 작은 수

by 항해 2023. 4. 3.

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

 

10811번: 바구니 뒤집기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2

www.acmicpc.net

 

하마터면 문제한테 질 뻔 했다.

 

1. [컴파일 에러] 변수 사용한것 중에 몇 개 정의를 안해서 컴파일 에러가 떴다. 

 

#include <iostream>

using namespace std;
int main(){
    int N, M, a, b, temp;
    cin >> N >> M;
    
    int List[N];

    for(int i = 0 ; i < N ; i++)
        List[i] = i+1;
    
    for(int i = 0 ; i < M ; i++){
        cin >> a >> b ;
        for(int j=a ; j < (a+b)/2 ; j++){
            temp = List[j];
            List[j] = List[b];
            List[b] = temp;
            b--;
        }   
    }
    
    for(int i = 0 ; i < N ; i++)
        cout << List[i] << " ";
    
    return 0;
}

 

2. [실패] 그래서 변수만 정의하면 되겠지 했는데 틀렸다. 

그래서 그 다음엔 (a+b)/2 가 정수형으로 나와서 안 되는 건가보다 하고 (float) (a+b)/2형을 줬다.

다시 생각해보니까 그냥 정수형이어도 j <= (a+b)/2 하면 범위가 맞다.

그래도 실패가 떴다. 흠.. temp = List [ j ]가 아니라 List [ j-1 ] 이어야 하네. List [ b ] 도 List [ b-1]로 줘야하고.

근데 또 실패했다. 그래서 이번엔 출력이 문제인가? 맨 마지막에 띄어쓰기가 더 들어가서 틀린건가? 하고 

 

	
    cout << List[0];
    
    for(int i = 1 ; i < N ; i++)
        cout << " " << List[i] ;

 

출력 형태를 바꿔봤다. 그래도 아니었다. 계속 틀려서 진짜 모르겠다 하고 넘겼다.

 

다음 날, 다시 찬찬히 살펴봤다. 그리고 변수도 그냥 문제에 맞춰서 다시 바꿨다. 그리고 보니, for문 안에 들어가는 j(변수명 바꾸기 전에는 b)가 직접적으로 건드려지는게 문제인 것 같았다. 

 

#include <iostream>

using namespace std;
int main(){
    int N, M, i, j, temp;
    cin >> N >> M;
    
    int List[N];

    for(int a = 0 ; a < N ; a++)
        List[a] = a+1;
    
    for(int a = 0 ; a < M ; a++){
        cin >> i >> j ;
        
        for(int b = i ; b <= (i+j)/2 ; b++){
            int count = j;
            temp = List[b-1];
            List[b-1] = List[count-1];
            List[count-1] = temp;
            count--;
        }   
    }

    for(int a = 0 ; a < N ; a++)
        cout << List[a] << " " ;
    
    return 0;
}

 

3. [실패] count가 for문 안에서 정의돼서 count-- 를 해도 다시 j로 정의되는 문제때문이네. 얘만 빼주면 되겠다.

 

#include <iostream>

using namespace std;
int main(){
    int N, M, i, j, temp;
    cin >> N >> M;
    
    int List[N];

    for(int a = 0 ; a < N ; a++)
        List[a] = a+1;
    
    for(int a = 0 ; a < M ; a++){
        cin >> i >> j ;
        int count = j;
        
        for(int b = i ; b <= (i+j)/2 ; b++){
            temp = List[b-1];
            List[b-1] = List[count-1];
            List[count-1] = temp;
            count--;
        }   
    }

    for(int a = 0 ; a < N ; a++)
        cout << List[a] << " " ;
    
    return 0;
}

 

4.[정답]

드디어 풀었다. 내가 이겼다!

뿌듯하기도 하면서 내가 생각해도 난이도가 낮은 문젠데 여기서부터 이렇게 막혀도 되는가 하는 생각이 든다.

 

 

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

 

10871번: X보다 작은 수

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

www.acmicpc.net

#include <iostream>

using namespace std;

int main(){
    int N, X;
    cin >> N >> X;
    
    int A[N];
    
    for(int i = 0; i < N; i++){
        cin >> A[i];
        if(A[i] < X)
            cout << A[i] << " "; 
    }
    
    return 0;
}

 

이 전 문제에서 고생해서 그런지 간단하구만~

배열 하나씩 입력하고 X랑 비교해서 출력.

댓글