본문 바로가기

난 이 분야 전문가야!/Algorithm

[백준][C] 17070 파이프 옮기기 1 - 풀이 공유

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

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 번호이고, 행과 열의 번호는 1부터 시작한다. 각각의 칸은 빈 칸이거나 벽이다. 오늘은 집 수리를 위해서 파이프 하나를 옮기려고 한다. 파이프는 아래와 같은 형태이고, 2개의 연속된 칸을 차지하는 크기이다. 파이프는 회전시킬 수 있으며, 아래와 같이

www.acmicpc.net

이번에는 삼성 A형 기출문제인 '파이프 옮기기 1'을 풀어보았습니다.

재귀 함수를 이용하여 풀었는데 다이나믹 프로그래밍이나 DFS/BFS를 이용해서 풀어도 가능할 것 같습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<stdio.h>
 
int house[20][20];
int N, cnt;
int direct[3][2= { {0,1},{1,1},{1,0} };
 
void move(int a, int b, int state) {
    int i;
 
    if (state == 1 && (house[a - 1][b] == 1 || house[a][b - 1== 1))       //상태가 대각선일 경우 벽을 스치는지 검토
        return;
 
    if (a == N - 1  && b == N - 1) {
        cnt++;
        return;
    }
    
    if (b >= N || a >= N || house[a][b] == 1)
        return;
 
    switch (state) {
    case 0:           // 상태가 가로일때
        for (i = 0; i < 2; i++
            move(a + direct[i][0], b + direct[i][1], i);
        break;
    case 1:           // 상태가 대각일때
        for (i = 0; i < 3; i++
            move(a + direct[i][0], b + direct[i][1], i);
        break;
    case 2:           // 상태가 세로일때
        for (i = 1; i < 3; i++
            move(a + direct[i][0], b + direct[i][1], i);
        break;
    }
}
 
int main() {
    scanf("%d"&N);
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            scanf("%d"&house[i][j]);
        }
    }
 
    if (house[N - 1][N - 1== 1) {
        printf("%d\n"0);
        return 0;
    }
 
    move(010);
    
    printf("%d\n", cnt);
 
    return 0;
}
cs

 

house : 집 상태를 저장한 2차원 배열

direct : 파이프의 이동경로 (direct[i] 에서 i는 파이프의 상태를 나타냄 i == 0일 경우 가로 상태 i == 1일 경우 대각선~)

 

move 재귀함수를 이용하여 파이프를 한 칸씩 이동시킵니다.

a와 b는 파이프의 새로 이동된 끝쪽 좌표를 의미합니다.

 

처음에 당연히 house[N - 1][N - 1]에는 벽이 없을 줄 알고

if (house[N - 1][N - 1== 1) {

    printf("%d\n"0);

    return 0;

}

이 조건을 안 걸어서 엄청 애먹었습니다... (문제를 정확히 이해하자)

728x90