Algorithm Problem/Python

[python] λ°±μ€€ - 3055. νƒˆμΆœ

deo2kim 2020. 9. 23. 20:25
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

  • G5 | BFS, κ·Έλž˜ν”„?

λ‹¨μˆœνžˆ μ΅œλ‹¨κ±°λ¦¬λ₯Ό μ°ΎλŠ” 것과 달리 맡이 계속 λ³€ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

λ‘œμ§μ€ κ°„λ‹¨ν•˜λ‹€.

  • κ³ μŠ΄λ„μΉ˜λ₯Ό μƒν•˜μ’Œμš°λ‘œ μ΄λ™μ‹œν‚¨λ‹€.
  • 물도 μƒν•˜μ’Œμš°λ‘œ ν˜λŸ¬λ„˜μΉœλ‹€.
  • λ‹€μ‹œ κ³ μŠ΄λ„μΉ˜λ₯Ό μƒν•˜μ’Œμš°λ‘œ μ΄λ™μ‹œν‚¨λ‹€. (ν•˜μ§€λ§Œ 물에 μž κ²¨μžˆλŠ” κ³ μŠ΄λ„μΉ˜λŠ” 이동할 수 μ—†λ‹€)
  • λ‹€μ‹œ 물을 μƒν•˜μ’Œμš°λ‘œ ν˜λŸ¬λ„˜μΉ˜κ²Œν•œλ‹€.
  • μœ„μ˜ 과정을 λ°˜λ³΅ν•˜λ©΄μ„œ κ³ μŠ΄λ„μΉ˜κ°€ ꡴에 λ„μ°©ν•˜λ©΄ 끝

πŸ’¨

πŸ’»μ†ŒμŠ€ μ½”λ“œ

def flood(w):
    new_water = []
    for x, y in w:
        for k in range(len(dx)):
            nx = x + dx[k]
            ny = y + dy[k]
            if 0 <= nx < R and 0 <= ny < C:
                if forest[nx][ny] == '.' or type(forest[nx][ny]) == int:
                    forest[nx][ny] = '*'
                    new_water.append((nx, ny))
    return new_water


def move_hedgehog(h):
    new_hedgehog = []
    for x, y in h:
        if forest[x][y] != '*':
            for k in range(len(dx)):
                nx = x + dx[k]
                ny = y + dy[k]
                if 0 <= nx < R and 0 <= ny < C:
                    if forest[nx][ny] == 'D':
                        forest[nx][ny] = forest[x][y] + 1
                        return 'finish'
                    if forest[nx][ny] == '.':
                        forest[nx][ny] = forest[x][y] + 1
                        new_hedgehog.append((nx, ny))
    return new_hedgehog


dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
if __name__ == '__main__':
    R, C = map(int, input().split())
    forest = [list(input()) for _ in range(R)]

    water = []
    hedgehog = []
    cave = []
    for i in range(R):
        for j in range(C):
            if forest[i][j] == '*':
                water.append((i, j))
            elif forest[i][j] == 'S':
                forest[i][j] = 0
                hedgehog.append((i, j))
            elif forest[i][j] == 'D':
                cave = [i, j]

    while hedgehog:
        hedgehog = move_hedgehog(hedgehog)
        if hedgehog == 'finish':
            print(forest[cave[0]][cave[1]])
            break
        water = flood(water)
    else:
        print('KAKTUS')

πŸ“•λ¬Έμ œ 확인

좜처: BACKJOON ONLINE JUDGE

링크: https://www.acmicpc.net/problem/3055

 

3055번: νƒˆμΆœ

μ‚¬μ•…ν•œ μ•”ν‘μ˜ κ΅°μ£Ό μ΄λ―Όν˜μ€ λ“œλ””μ–΄ λ§ˆλ²• κ΅¬μŠ¬μ„ 손에 λ„£μ—ˆκ³ , κ·Έ λŠ₯λ ₯을 μ‹€ν—˜ν•΄λ³΄κΈ° μœ„ν•΄ 근처의 ν‹°λ–±μˆ²μ— ν™μˆ˜λ₯Ό μΌμœΌν‚€λ €κ³  ν•œλ‹€. 이 μˆ²μ—λŠ” κ³ μŠ΄λ„μΉ˜κ°€ ν•œ 마리 μ‚΄κ³  μžˆλ‹€. κ³ μŠ΄λ„μΉ˜λŠ” 제��

www.acmicpc.net


문제

μ‚¬μ•…ν•œ μ•”ν‘μ˜ κ΅°μ£Ό μ΄λ―Όν˜μ€ λ“œλ””μ–΄ λ§ˆλ²• κ΅¬μŠ¬μ„ 손에 λ„£μ—ˆκ³ , κ·Έ λŠ₯λ ₯을 μ‹€ν—˜ν•΄λ³΄κΈ° μœ„ν•΄ 근처의 ν‹°λ–±μˆ²μ— ν™μˆ˜λ₯Ό μΌμœΌν‚€λ €κ³  ν•œλ‹€. 이 μˆ²μ—λŠ” κ³ μŠ΄λ„μΉ˜κ°€ ν•œ 마리 μ‚΄κ³  μžˆλ‹€. κ³ μŠ΄λ„μΉ˜λŠ” 제일 μΉœν•œ 친ꡬ인 λΉ„λ²„μ˜ ꡴둜 κ°€λŠ₯ν•œ 빨리 도망가 ν™μˆ˜λ₯Ό ν”Όν•˜λ €κ³  ν•œλ‹€.

ν‹°λ–±μˆ²μ˜ μ§€λ„λŠ” Rν–‰ Cμ—΄λ‘œ 이루어져 μžˆλ‹€. λΉ„μ–΄μžˆλŠ” 곳은 '.'둜 ν‘œμ‹œλ˜μ–΄ 있고, 물이 μ°¨μžˆλŠ” 지역은 '*', λŒμ€ 'X'둜 ν‘œμ‹œλ˜μ–΄ μžˆλ‹€. λΉ„λ²„μ˜ ꡴은 'D'둜, κ³ μŠ΄λ„μΉ˜μ˜ μœ„μΉ˜λŠ” 'S'둜 λ‚˜νƒ€λ‚΄μ–΄μ Έ μžˆλ‹€.

맀 λΆ„λ§ˆλ‹€ κ³ μŠ΄λ„μΉ˜λŠ” ν˜„μž¬ μžˆλŠ” μΉΈκ³Ό μΈμ ‘ν•œ λ„€ μΉΈ 쀑 ν•˜λ‚˜λ‘œ 이동할 수 μžˆλ‹€. (μœ„, μ•„λž˜, 였λ₯Έμͺ½, μ™Όμͺ½) 물도 맀 λΆ„λ§ˆλ‹€ λΉ„μ–΄μžˆλŠ” 칸으둜 ν™•μž₯ν•œλ‹€. 물이 μžˆλŠ” μΉΈκ³Ό μΈμ ‘ν•΄μžˆλŠ” λΉ„μ–΄μžˆλŠ” μΉΈ(적어도 ν•œ 변을 곡유)은 물이 차게 λœλ‹€. λ¬Όκ³Ό κ³ μŠ΄λ„μΉ˜λŠ” λŒμ„ 톡과할 수 μ—†λ‹€. 또, κ³ μŠ΄λ„μΉ˜λŠ” 물둜 μ°¨μžˆλŠ” κ΅¬μ—­μœΌλ‘œ 이동할 수 μ—†κ³ , 물도 λΉ„λ²„μ˜ μ†Œκ΅΄λ‘œ 이동할 수 μ—†λ‹€.

ν‹°λ–±μˆ²μ˜ 지도가 μ£Όμ–΄μ‘Œμ„ λ•Œ, κ³ μŠ΄λ„μΉ˜κ°€ μ•ˆμ „ν•˜κ²Œ λΉ„λ²„μ˜ ꡴둜 μ΄λ™ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ΅œμ†Œ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

κ³ μŠ΄λ„μΉ˜λŠ” 물이 μ°° μ˜ˆμ •μΈ 칸으둜 이동할 수 μ—†λ‹€. 즉, λ‹€μŒ μ‹œκ°„μ— 물이 μ°° μ˜ˆμ •μΈ 칸으둜 κ³ μŠ΄λ„μΉ˜λŠ” 이동할 수 μ—†λ‹€. 이동할 수 있으면 κ³ μŠ΄λ„μΉ˜κ°€ 물에 빠지기 λ•Œλ¬Έμ΄λ‹€.

μž…λ ₯

첫째 쀄에 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ Rκ³Ό Cκ°€ 주어진닀.

λ‹€μŒ R개 μ€„μ—λŠ” ν‹°λ–±μˆ²μ˜ 지도가 주어지며, λ¬Έμ œμ—μ„œ μ„€λͺ…ν•œ 문자만 주어진닀. 'D'와 'S'λŠ” ν•˜λ‚˜μ”©λ§Œ 주어진닀.

좜λ ₯

첫째 쀄에 κ³ μŠ΄λ„μΉ˜κ°€ λΉ„λ²„μ˜ ꡴둜 이동할 수 μžˆλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ„ 좜λ ₯ν•œλ‹€. λ§Œμ•½, μ•ˆμ „ν•˜κ²Œ λΉ„λ²„μ˜ ꡴둜 이동할 수 μ—†λ‹€λ©΄, "KAKTUS"λ₯Ό 좜λ ₯ν•œλ‹€.

λ°˜μ‘ν˜•