μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] λ°±νŠΈλž˜ν‚Ή - 9207. 페그 μ†”λ¦¬ν…Œμ–΄

λ˜νš¨λ‹ˆ 2020. 3. 23. 22:22

문제

페그 μ†”λ¦¬ν…Œμ–΄λŠ” ꡬ멍이 λš«λ €μžˆλŠ” 이차원 κ²Œμž„νŒμ—μ„œ ν•˜λŠ” κ²Œμž„μ΄λ‹€. 각 κ΅¬λ©μ—λŠ” 핀을 ν•˜λ‚˜ 꽂을 수 μžˆλ‹€.

핀은 μˆ˜ν‰, 수직 λ°©ν–₯으둜 μΈμ ‘ν•œ 핀을 λ›°μ–΄λ„˜μ–΄μ„œ κ·Έ ν•€μ˜ λ‹€μŒ 칸으둜 μ΄λ™ν•˜λŠ” κ²ƒλ§Œ ν—ˆμš©λœλ‹€. μΈμ ‘ν•œ ν•€μ˜ λ‹€μŒ 칸은 λΉ„μ–΄μžˆμ–΄μ•Ό ν•˜κ³  κ·Έ μΈμ ‘ν•œ 핀은 μ œκ±°λœλ‹€.

ν˜„μž¬ κ²Œμž„νŒμ— κ½‚ν˜€μžˆλŠ” ν•€μ˜ μƒνƒœκ°€ μ£Όμ–΄μ§„λ‹€. μ΄λ•Œ, 핀을 적절히 μ›€μ§μ—¬μ„œ κ²Œμž„νŒμ— λ‚¨μ•„μžˆλŠ” ν•€μ˜ 개수λ₯Ό μ΅œμ†Œλ‘œ ν•˜λ €κ³  ν•œλ‹€. 또, κ·Έλ ‡κ²Œ 남기기 μœ„ν•΄ ν•„μš”ν•œ μ΅œμ†Œ μ΄λ™νšŸμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 1 ≤ N ≤ 100이 μ£Όμ–΄μ§„λ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” κ²Œμž„νŒμ˜ 초기 μƒνƒœμ΄λ‹€.

κ²Œμž„νŒμ€ λͺ¨λ‘ 같은 λͺ¨μ–‘을 κ°€μ§„λ‹€. (예제 μ°Έκ³ ) '.'λŠ” 빈 μΉΈ, 'o'λŠ” 핀이 κ½‚ν˜€μžˆλŠ” μΉΈ, '#'λŠ” ꡬ멍이 μ—†λŠ” 칸이닀. ν•€μ˜ κ°œμˆ˜λŠ” μ΅œλŒ€ 8이며, 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 빈 μ€„λ‘œ κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€.

 

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, 핀을 μ›€μ§μ—¬μ„œ 남길 수 μžˆλŠ” ν•€μ˜ μ΅œμ†Œ κ°œμˆ˜μ™€ κ·Έ 개수λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ μ΅œμ†Œ 이동 횟수λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1

3
###...###
..oo.....
.....oo..
.........
###...###

###...###
..oo.o...
...o.oo..
...oo....
###...###

###o..###
.o.oo....
o.o......
.o.o.....
###...###

 

예제 좜λ ₯1

1 3 

1 7 

1 7

 

생각

 

 

μž‘μ„±ν•œ μ½”λ“œ

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
 
using namespace std;
 
char map[6][10];
 
// μƒ, ν•˜, μ’Œ, μš°
int dx[] = {-1100};
int dy[] = {00-11};
 
int p_num, m_num;
int num;
 
void dfs(int x, int y, int n){
    if(p_num == 0 || p_num > n){
        p_num = n;
        m_num = num - n;
    }
    
    for(int k=0; k<4; k++){
        // λ‹€μŒ μΉΈ
        int nx = x+dx[k]; 
        int ny = y+dy[k];
        
        if(nx < 0 || ny < 0 || nx >= 5 || ny >=9 ) continue;
 
        // λ‹€μŒ μΉΈμ΄ o이고  
        if(map[nx][ny] == 'o'){
            // λ‹€μŒλ‹€μŒμΉΈ
            int nnx = nx + dx[k];
            int nny = ny + dy[k];
            if(nnx < 0 || nny < 0 || nnx >= 5 || nny >=9 ) continue;
 
            // λ‹€μŒ λ‹€μŒ μΉΈμ΄ λΉ„μ–΄μžˆμœΌλ©΄
            if(map[nnx][nny] == '.'){
                map[x][y] = map[nx][ny] = '.';
                map[nnx][nny] = 'o';
 
                for(int i=0; i<5; i++){
                    for(int j=0; j<9; j++){
                        if(map[i][j] == 'o'){
                            dfs(i, j, n-1);
                        }
                    }
                }
                map[x][y] = map[nx][ny] = 'o';
                map[nnx][nny] = '.';
            }
        }
    }    
    return;
}
 
int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int n;
    cin >> n;
 
    while(n--){
        p_num = m_num = 0;
        int cnt = 0// ν•€ κ°œμˆ˜ μ²΄ν¬
        for(int i=0; i<5; i++){
            for(int j=0; j<9; j++){
                cin >> map[i][j];
                if(map[i][j]=='o') cnt ++;
            }
        }
        num = cnt;
        for(int i=0; i<5; i++){
            for(int j=0; j<9; j++){
                if(map[i][j] == 'o'){
                    dfs(i, j, cnt);
                }
            }
        }
 
        cout << p_num << " " << m_num << "\n";
    }
   
    return 0;
}
 
Colored by Color Scripter
λ°˜μ‘ν˜•