danbibibi
article thumbnail

문제

문제 바로가기> BOJ 2666번: 벽장문의 이동

 

2666번: 벽장문의 이동

첫 번째 줄에 벽장의 개수를 나타내는 3보다 크고 20보다 작거나 같은 하나의 정수, 두 번째 줄에 초기에 열려있는 두 개의 벽장을 나타내는 두 개의 정수, 그리고 세 번째 줄에는 사용할 벽장들

www.acmicpc.net

 

풀이

처음에는 3가지 케이스 별로 나누어서 풀었는데,

right 보다 작은 경우는 left 문을 이용하고, left보다 작은 경우는 right 문을 이용하도록 하면

두개의 if문으로 코드를 줄일 수 있었다..! 밑에 그림을 참고하자 :)

+ 추가로 left와 right를 파라미터로 가지고 다니면, 원상태로 복원시켜줄 필요가 없어서 변수관리가 편리하다!

#include<iostream>
#define MAX 25
using namespace std;

int N, M, sl, sr;
int ans=10001;
int order[MAX];

void input(){
    cin >> N;
    cin >> sl >> sr;
    cin >> M;
    for(int i=1; i<=M; i++) cin >> order[i];
}

void solve(int m, int l, int r, int move){
    if(ans <= move) return; // 더 작게 이동하는 방법을 이미 알고 있음
    if(m > M){ // 종료 조건
        ans = move;
        return;
    }
    if(order[m] > l) solve(m+1, l, order[m], move+abs(order[m]-r)); // right 문을 이용
    if(order[m] < r) solve(m+1, order[m], r, move+abs(order[m]-l)); // left 문을 이용
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    input();
    solve(1, sl, sr, 0);
    cout << ans;
}

 

 

처음 풀이한 코드

#include<iostream>
#define MAX 25
using namespace std;
 
int N, M, ans=10001;
int order[MAX], openDoorIdx[2];
 
void input(){
    cin >> N;
    cin >> openDoorIdx[0] >> openDoorIdx[1];
    cin >> M;
    for(int i=1; i<=M; i++) cin >> order[i];
}
 
void solve(int m, int move){
    if(ans <= move) return; // 더 작게 이동하는 방법을 이미 알고 있음
    if(m == M+1){
        ans = move;
        return;
    }
 
    if(openDoorIdx[0] > openDoorIdx[1]) { // openDoorIdx[0]이 openDoorIdx[1]보다 작음을 보장
        int tmp = openDoorIdx[0];
        openDoorIdx[0] = openDoorIdx[1];
        openDoorIdx[1] = tmp;
    }
 
    if(order[m] < openDoorIdx[0] && order[m] < openDoorIdx[1]){ // use open1 open2
        int tmp = openDoorIdx[0];
        openDoorIdx[0] = order[m];
        solve(m+1, move+tmp-order[m]);
        openDoorIdx[0] = tmp;
    }
    else if(order[m] > openDoorIdx[0] && order[m] > openDoorIdx[1]){ // open1 open2 use
        int tmp = openDoorIdx[1];
        openDoorIdx[1] = order[m];
        solve(m+1, move+order[m]-tmp);
        openDoorIdx[1] = tmp;
    }
    else{ // open1 use open2
        int tmp = openDoorIdx[0];
        openDoorIdx[0] = order[m];
        solve(m+1, move+order[m]-tmp);
        openDoorIdx[0] = tmp;
 
        tmp = openDoorIdx[1];
        openDoorIdx[1] = order[m];
        solve(m+1, move+tmp-order[m]);
        openDoorIdx[1] = tmp;
    }
}
 
int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    input();
    solve(1, 0);
    cout << ans;
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 1963번: 소수 경로  (1) 2024.01.21
BOJ 9935번: 문자열 폭발  (0) 2024.01.05
BOJ 10157번: 자리배정  (0) 2023.12.27
BOJ 8983번: 사냥꾼  (0) 2023.12.22
BOJ 1079번: 쇠막대기  (0) 2023.12.15
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로