[백준] 10811, 바구니 특정 구간을 reverse 시키기 (<algorithm> 헤더의 swap 함수 사용)

YUN·2026년 2월 19일

C++

목록 보기
30/85


위의 예제 입력으로 진행해보면

12345 -> 21345 -> 21435 -> 34125

와 같이 수행되어 3 4 1 2 5 의 결과를 얻는다.

이러한 reverse (=구간 swap) 는 반복문 + <algorithm> 헤더의 swap(a,b) 로 구현이 가능하다.

1. 풀이

#include <iostream>
#include <algorithm>

using namespace std;
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int N,M,i,j;
    cin >> N >> M;
    int arr[N+1] = {};
    for(int t=1; t<N+1; t++) arr[t] = t;
    for(int k=0; k<M; k++) {
        cin >> i >> j;
        if (i!=j) {
            for(int q=0; q<(j-i+1)/2; q++) swap(arr[i+q], arr[j-q]);
        }
    }
    for(int t=1; t<N+1; t++) cout << arr[t] << " ";
}

현재 최종 결과 출력시 비교의 대상이 순서 이니, 순서를 인덱스로 잡고 바구니 번호를 배열의 요소로 한다.

우선 배열을 초기화 해주고 -> 구간 swap을 m번 반복해준다 -> 이후 결과를 출력해준다.

구간 swap의 경우 대칭적으로 동작하니

(시작 인덱스 + 0) 과 (끝 인덱스 - 0) swap
(시작 인덱스 + 1) 과 (끝 인덱스 - 1) swap
(시작 인덱스 + 2) 과 (끝 인덱스 - 2) swap
(시작 인덱스 + 3) 과 (끝 인덱스 - 3) swap
(시작 인덱스 + 4) 과 (끝 인덱스 - 4) swap
.
.
.

와 같은 식으로 수행해주면 된다.

2. 느낀 점

(1) <algorithm> 헤더는 정말 유용하다. 잊지말자.

이 문제를 처음풀때 altorithm 헤더에 swap() 함수가 존재하는지 몰랐어서 직접 temp 변수두고 swap을 구현했다.

그런데 알고보니 algorithm 헤더에 swap 함수가 존재했고, 다음부터는 시간 절약을 위해 algorithm 헤더의 swap 함수를 사용해야겠다.

또한 자꾸 문제풀다보니, 배열 유형만 그런건진 모르겠지만 <algorithm> 헤더의 함수들이 매우 많이 사용된다.

이때까지 나온게 sort(시작 주소, 끝 주소), max(a,b), swap(a,b) 인데 ,

배운 것들 까먹지 않도록 잘 기억해둬야겠다.

(2) 반복문 스타일

나는 보통 특정 횟수에 대한 반복은 for문을 사용한다.

그런데 다른 사람들의 코드를 보니 m번 반복이 필요한 경우

while(m--) {

...
}

이런식으로 코드를 작성하는 것을 확인했다.

꽤 편리한 방법같아 보이고, 나도 이 방법을 사용해봐야겠다.

(3) 문제에서 변수가 i,j,k로 나올때 조심하자

보통 반복문 변수로 i,j,k를 많이 쓴다. 나도 보통 그렇게 쓰는데, 이 문제는 문제 자체에서 변수를 i,j,k로 써서 내가 무의식적으로 반복문의 변수를 i,j,k로 썼더니 오류가 발생했다.

이런 경우는 조심해야겠다.

이런 경우는 그냥 문제에서 나오는 변수 i,j,k를 a,b,c로 쓰고 반복문은 그대로 i,j,k로 쓰는게 편하지 않을까 싶다!

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글