• toc {:toc}

문제

철수의 ν† λ§ˆν†  농μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” 큰 μ°½κ³ λ₯Ό κ°€μ§€κ³  μžˆλ‹€. ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 격자λͺ¨μ–‘ μƒμžμ˜ 칸에 ν•˜λ‚˜μ”© 넣은 λ‹€μŒ, μƒμžλ“€μ„ 수직으둜 μŒ“μ•„ μ˜¬λ €μ„œ 창고에 λ³΄κ΄€ν•œλ‹€.

https://upload.acmicpc.net/c3f3343d-c291-40a9-9fe3-59f792a8cae9/-/preview/

창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” 잘 읡은 것도 μžˆμ§€λ§Œ, 아직 읡지 μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ 수 μžˆλ‹€. 보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, 읡은 ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ 곳에 μžˆλŠ” 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ€ 읡은 ν† λ§ˆν† μ˜ 영ν–₯을 λ°›μ•„ 읡게 λœλ‹€. ν•˜λ‚˜μ˜ ν† λ§ˆν† μ— μΈμ ‘ν•œ 곳은 μœ„, μ•„λž˜, μ™Όμͺ½, 였λ₯Έμͺ½, μ•ž, λ’€ μ—¬μ„― λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” 영ν–₯을 μ£Όμ§€ λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ 혼자 μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€. μ² μˆ˜λŠ” 창고에 λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ 며칠이 μ§€λ‚˜λ©΄ λ‹€ 읡게 λ˜λŠ”μ§€ κ·Έ μ΅œμ†Œ 일수λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.

ν† λ§ˆν† λ₯Ό 창고에 λ³΄κ΄€ν•˜λŠ” 격자λͺ¨μ–‘μ˜ μƒμžλ“€μ˜ 크기와 읡은 ν† λ§ˆν† λ“€κ³Ό 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 며칠이 μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μƒμžμ˜ 일뢀 μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

μž…λ ₯

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,Nκ³Ό μŒ“μ•„μ˜¬λ €μ§€λŠ” μƒμžμ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Hκ°€ μ£Όμ–΄μ§„λ‹€. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≀ M ≀ 100, 2 ≀ N ≀ 100, 1 ≀ H ≀ 100 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” κ°€μž₯ λ°‘μ˜ μƒμžλΆ€ν„° κ°€μž₯ μœ„μ˜ μƒμžκΉŒμ§€μ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ§„λ‹€. 즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” ν•˜λ‚˜μ˜ μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 μ£Όμ–΄μ§„λ‹€. 각 μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† λ“€μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ μ£Όμ–΄μ§„λ‹€. μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0 은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ N개의 쀄이 H번 λ°˜λ³΅ν•˜μ—¬ μ£Όμ–΄μ§„λ‹€. ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€ μ΅œμ†Œ 며칠이 κ±Έλ¦¬λŠ”μ§€λ₯Ό κ³„μ‚°ν•΄μ„œ 좜λ ₯ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

좜처:https://www.acmicpc.net/problem/7569

풀이

2022-08-06 풀이

tuple 의 μ‚¬μš©μ— μ΅μˆ™ν•΄μ§ˆ ν•„μš”κ°€ μžˆλ‹€.

  • 2개 자료λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” pairλ₯Ό μ‚¬μš©ν•˜μ—¬ 묢을 수 μžˆμ—ˆμ§€λ§Œ 3개 μ΄μƒμ˜ 자료λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” tuple을 μ΄μš©ν•˜μ—¬ 묢을 수 μžˆλ‹€.
  • λ§Œλ“€ λ•Œ make_tuple, 값을 κΊΌλ‚Ό λ•Œ get<>(자료λͺ…) ν˜•νƒœλ‘œ μ‚¬μš©ν•œλ‹€.
  • 3μ°¨μ›μœΌλ‘œ μ œμž‘ν•˜λ‹€λ³΄λ‹ˆ 인덱슀 μ μš©μ‹œν‚¬ λ•Œ μ‹€μˆ˜ν•  ν™•λ₯ μ΄ λ†’μ•„μ§„λ‹€.

μΌμ •ν•œ 기쀀을 두고 인덱슀 섀정을 ν•˜λ„λ‘ μ—°μŠ΅ν•΄μ•Ό ν•œλ‹€.

#include <bits/stdc++.h>
using namespace std;
 
int dist[102][102][102];
int board[102][102][102];
int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = {0, 0, -1, 1, 0, 0};
int dz[6] = {0, 0, 0, 0, -1, 1};
int m, n, h;
queue<tuple<int, int, int>> q;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n >> h;
 
    // μ΄ˆκΈ°μ— 읡은 ν† λ§ˆν†  확인
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < m; k++){
                int temp;
                cin >> temp;
                board[i][j][k] = temp;
                if(board[i][j][k]== 0){
                    dist[i][j][k] = -1;
                }
                if(board[i][j][k] == 1)
                    q.push({j, k, i});
            }
        }
    }
 
// dist, board ν™•μΈμš©
    /*
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < m; k++){
                cout << dist[i][j][k];
            }
            cout << endl;
        }
        cout << endl << endl;
    }
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < m; k++){
                cout << board[i][j][k];
            }
            cout << endl;
        }
        cout << endl << endl;
    }
    */
 
// bfs
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < m; k++){
                while(!q.empty()){
                    auto cur = q.front(); q.pop();
                    for(int dir = 0; dir < 6; dir++){
                        int nx = get<0>(cur) + dx[dir];
                        int ny = get<1>(cur) + dy[dir];
                        int nz = get<2>(cur) + dz[dir];
                        if(nx < 0 || nx >= n || ny < 0 || ny >= m || nz < 0 || nz >= h) continue;
                        if(dist[nz][nx][ny] >= 0 || board[nz][nx][ny] == -1) continue;
                        dist[nz][nx][ny] = dist[get<2>(cur)][get<0>(cur)][get<1>(cur)] + 1;
                        q.push({nx, ny, nz});
                    }
                }
            }
        }
    } 
 
    int ans = 0;
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < m; k++){
                if(dist[i][j][k] == -1){
                    cout << -1;
                    return 0;
                }
                ans = max(ans, dist[i][j][k]);
            }
        }
    }
    cout << ans << endl;
}

2023-09-08 풀이

μ΄μ „μ˜ λ‹€λ₯Έ 풀이듀을 μ‚΄νŽ΄λ³΄λ©΄ λ°°μ—΄μ˜ 인덱슀λ₯Ό xλŠ” κ°€λ‘œ, yλŠ” μ„Έλ‘œμΆ•μ΄λΌ μƒκ°ν–ˆμ„ λ•Œ, λ¬΄ν„±λŒ€κ³  μ•„λž˜ 잘λͺ»λœ 인덱슀 ν‘œκΈ°μ²˜λŸΌ x, y μˆœμ„œλ‘œ μ‚¬μš©ν–ˆλ‹€. ν•˜μ§€λ§Œ 이 μˆœμ„œλŠ” 2μ°¨μ›μ΄μ—ˆκΈ°μ— xκ°€ μ„Έλ‘œμΆ•, yκ°€ κ°€λ‘œμΆ• 역할을 ν•˜μ—¬ 정상 μž‘λ™ν•œ 것이지 μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ ν‘œκΈ°μ΄λ‹€. λ•Œλ¬Έμ—, μ˜¬λ°”λ₯Έ ν‘œκΈ°μ™€ 같이 인덱슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
특히, 차원이 올라갈수둝 μ €μž₯ν•˜λŠ” 인덱슀 ν‘œκΈ°κ°€ μ€‘μš”ν•˜κΈ° λ•Œλ¬Έμ— μœ μ˜ν•΄μ„œ ν’€μ΄ν•œλ‹€.

μ˜›λ‚  ν’€μ΄μ—μ„œλŠ” tuple을 μ‚¬μš©ν–ˆλŠ”λ° μ΄λ²ˆμ—λŠ” ꡬ쑰체λ₯Ό μ‚¬μš©ν•΄ 풀이해봀닀. tuple둜 λ§Œλ“€ λ•Œλ„ λ§ˆμ°¬κ°€μ§€μ§€λ§Œ, ꡬ쑰체λ₯Ό λ§Œλ“€ λ•Œλ„ x, y, z의 μˆœμ„œμ— μ£Όμ˜ν•œλ‹€.

board[x][y]           // 잘λͺ»λœ 인덱슀 ν‘œκΈ°
board[y][x]           // μ˜λ―Έμƒ μ˜¬λ°”λ₯Έ ν‘œκΈ°
board[z][y][x]        // 3μ°¨μ›μ—μ„œμ˜ μ˜¬λ°”λ₯Έ 인덱슀 ν‘œκΈ°
#include <bits/stdc++.h>
using namespace std;
 
struct point{
    int z;
    int y;
    int x;
};
 
int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = {0, 0, -1, 1, 0, 0};
int dz[6] = {0, 0, 0, 0, -1, 1};
int M, N, H;
int board[101][101][101];
queue<point> q;
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> M >> N >> H;
 
    for(int i = 0; i < H; i++){
        for(int j = 0; j < N; j++){
            for(int k = 0; k < M; k++){
                cin >> board[i][j][k];
                if(board[i][j][k] == 1){
                    q.push({i, j, k});
                }
            }
        }
    }
 
    int res = 0;
    while(!q.empty()){
        point cur = q.front(); q.pop();
        for(int dir = 0; dir < 6; dir++){
            int nx = cur.x + dx[dir];
            int ny = cur.y + dy[dir];
            int nz = cur.z + dz[dir];
            if(nx < 0 || nx >= M || ny < 0 || ny >= N || nz < 0 || nz >= H) continue;
            if(board[nz][ny][nx] >= 1 || board[nz][ny][nx] == -1) continue;
            q.push({nz, ny, nx});
            board[nz][ny][nx] = board[cur.z][cur.y][cur.x] + 1;
        }
    }
 
    for(int i = 0; i < H; i++){
        for(int j = 0; j < N; j++){
            for(int k = 0; k < M; k++){
                if(board[i][j][k] == 0){
                    cout << -1 << '\n';
                    exit(0);
                }
                if(board[i][j][k] > res){
                    res = board[i][j][k];
                }
            }
        }
    }
 
    cout << res-1 << '\n';
 
    return 0;
}