Algorithm/πŸ‘ 문제

[2178] λ―Έλ‘œνƒμƒ‰

YURIπŸ•πŸ“πŸΆ 2022. 5. 2. 15:30
λ°˜μ‘ν˜•

λ―Έλ‘œνƒμƒ‰ πŸͺ™

N×M크기의 λ°°μ—΄λ‘œ ν‘œν˜„λ˜λŠ” λ―Έλ‘œκ°€ μžˆλ‹€.

λ―Έλ‘œμ—μ„œ 1은 이동할 수 μžˆλŠ” 칸을 λ‚˜νƒ€λ‚΄κ³ , 0은 이동할 수 μ—†λŠ” 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ λ―Έλ‘œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, (1, 1)μ—μ„œ μΆœλ°œν•˜μ—¬ (N, M)의 μœ„μΉ˜λ‘œ 이동할 λ•Œ μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. ν•œ μΉΈμ—μ„œ λ‹€λ₯Έ 칸으둜 이동할 λ•Œ, μ„œλ‘œ μΈμ ‘ν•œ 칸으둜만 이동할 수 μžˆλ‹€.

μœ„μ˜ μ˜ˆμ—μ„œλŠ” 15칸을 μ§€λ‚˜μ•Ό (N, M)의 μœ„μΉ˜λ‘œ 이동할 수 μžˆλ‹€. 칸을 μ…€ λ•Œμ—λŠ” μ‹œμž‘ μœ„μΉ˜μ™€ 도착 μœ„μΉ˜λ„ ν¬ν•¨ν•œλ‹€.

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ N, M(2 ≤ N, M ≤ 100)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” M개의 μ •μˆ˜λ‘œ λ―Έλ‘œκ°€ μ£Όμ–΄μ§„λ‹€. 각각의 μˆ˜λ“€μ€ λΆ™μ–΄μ„œ μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 쀄에 μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό 좜λ ₯ν•œλ‹€. 항상 λ„μ°©μœ„μΉ˜λ‘œ 이동할 수 μžˆλŠ” 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

예제

4 6
101111
101010
101011
111011

output : 15

풀이

ν•˜λ‚˜μ˜ μ‹œμž‘μ μ—μ„œ λ„μ°©μ κΉŒμ§€μ˜ 거리λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

ν˜„μž¬ μΉΈ(Pair cur)의 μƒν•˜μ’Œμš°λ‘œ μ—°κ²° 된 칸듀을 λ°©λ¬Έν•  λ•Œ, ν˜„μž¬ μΉΈκ³Ό κ·Έ 칸의 κ±°λ¦¬λŠ” +1이 λœλ‹€(visited[nx][ny] = visited[cur.x][cur.y] + 1).

이λ₯Ό μ΄μš©ν•΄μ„œ, μ‹œμž‘μ μ—μ„œλΆ€ν„° λͺ¨λ“  칸의 거리λ₯Ό 계산할 수 μžˆλ‹€(μ‹œμž‘μ μ—μ„œ μ–Όλ§ˆλ§ŒνΌ λ–¨μ–΄μ Έ μžˆλŠ”μ§€)

 

μ½”λ“œ

Queue<Pair> q = new LinkedList<>();
q.add(new Pair(0, 0));
visited[0][0] = 1;

while (!q.isEmpty()) {
    Pair cur = q.poll();

    for (int dir = 0; dir < 4; dir++) {
        int nx = cur.x + dx[dir];
        int ny = cur.y + dy[dir];

        if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
        if (!map[nx][ny] || visited[nx][ny] != 0) continue;

        visited[nx][ny] = visited[cur.x][cur.y] + 1;
        q.add(new Pair(nx, ny));
    }
}

System.out.println(visited[n - 1][m - 1]);
http://boj.kr/e265dd680e444136817e173f55695d6b
 

곡유 μ†ŒμŠ€ 보기

 

www.acmicpc.net

 

λ°˜μ‘ν˜•