ABOUT ME

์•ˆ๋…•ํ•˜์„ธ์š”.

Today
Yesterday
Total
  • [Programmers] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ with Python
    PS 2021. 8. 29. 01:57
    728x90
    ๋ฐ˜์‘ํ˜•

    ๐Ÿ“Œ Programmers - [ ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ ]

    ๐Ÿ’ก ์กฐ๊ฑด ๋ฐ ํ’€์ด

    1. ๋Œ€๊ธฐ์‹ค์— ์‘์‹œ์ž๋“ค์ด ๋ฉด์ ‘์„ ์œ„ํ•ด ๋Œ€๊ธฐ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋Œ€๊ธฐ์‹ค์— ์žˆ๋Š” ๋Œ€๊ธฐ์ž๋“ค์ด ๊ฑฐ๋ฆฌ ๋‘๊ธฐ๋ฅผ ์ž˜ ์ง€ํ‚ค๊ณ  ์žˆ์„๊นŒ?
    2. ๋Œ€๊ธฐ์‹ค์€ 5๊ฐœ, ๊ฐ ๋Œ€๊ธฐ์‹ค์€ 5 * 5์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
    3. ์‘์‹œ์ž๋“ค ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋Š” ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋Š” 2 ์ดํ•˜๋กœ ์•‰์„ ์ˆ˜ ์—†์œผ๋‹ˆ 3 ์ด์ƒ์ด์–ด์•ผํ•œ๋‹ค.
    4. ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๊ฐ€ 2์ดํ•˜์—ฌ๋„ ์‘์‹œ์ž ์‚ฌ์ด์— ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ง‰ํ˜€ ์žˆ์œผ๋ฉฐ ์ง€๋‚˜๊ฐˆ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‘์‹œ์ž๋กœ์˜ ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋ฉด ์ƒ๊ด€์ด ์—†๋‹ค.
    5. BFS ์œ ํ˜•์˜ ๋ฌธ์ œ
    6. ๋‘ ํ…Œ์ด๋ธ” T1, T2๊ฐ€ ํ–‰๋ ฌ (r1, c1), (r2, c2)์— ๊ฐ๊ฐ ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด,
      T1, T2 ์‚ฌ์ด์˜ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋Š” |r1 - r2| + |c1 - c2|
    7. ์‘์‹œ์ž, ํ…Œ์ด๋ธ”, ํŒŒํ‹ฐ์…˜ = P, O, X
    8. ์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ์˜ ์‹œ๊ฐ„์€ 10์ดˆ.

    ๐Ÿ–ฅ ์†Œ์Šค ์ฝ”๋“œ

    from collections import deque
    
    dx, dy = [1, -1, 0, 0], [0, 0, -1, 1]
    
    
    def bfs(board, now, goal, dist):
        q = deque()
        visited = []
        x, y = now
        q.append((0, x, y, []))
        visited.append(now)
        check = False
    
        while q:
            cost, x, y, visit = q.popleft()
    
            # ์›€์ง์ธ ๊ฑฐ๋ฆฌ๊ฐ€ ๋งจํ—คํŠผ ๊ฑฐ๋ฆฌ๋ณด๋‹ค ๋งŽ์œผ๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
            if cost > dist:
                continue
    
            if (x, y) == goal:
                for i, j in visit:
                    if board[i][j] == 'X':
                        check = True
                    elif board[i][j] == 'O':
                        return False
    
            for i in range(4):
                nx, ny = dx[i] + x, y + dy[i]
                if -1 < nx < 5 and -1 < ny < 5:
                    if (nx, ny) not in visited:
                        # ๋ชฉํ‘œ ์ง€์ ์„ visited ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
                        # ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๊ฒฝ๋กœ๋ฅผ ์—ผ๋‘์— ๋‘์–ด ๊ณ„์‚ฐํ•œ๋‹ค.
                        if (nx, ny) != goal:
                            visited.append((nx, ny))
                        temp = visit[:]
                        temp.append((nx, ny))
                        q.append((cost + 1, nx, ny, temp))
        return check
    
    
    def solution(places):
        answer = []
    
        for i in range(len(places)):
            board = []
            data = places[i]
    
            ps = []
    
            # ๋Œ€๊ธฐ์‹ค ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
            for j in range(5):
                for k in range(5):
                    if data[j][k] == 'P':
                        ps.append((j, k))
                board.append(list(data[j]))
    
            ps.sort()
            check = True
            for j in range(len(ps)):
                x1, y1 = ps[j]
                for k in range(j + 1, len(ps)):
                    x2, y2 = ps[k]
                    dist = abs(x1 - x2) + abs(y1 - y2)
                    if dist < 3:
                        if not bfs(board, ps[j], ps[k], dist):
                            check = False
                            break
                if not check:
                    break
    
            answer.append(1) if check else answer.append(0)
    
        return answer

    ๐Ÿ”– ์˜ˆ์ œ ๋ฐ ์‹คํ–‰๊ฒฐ๊ณผ

    ์˜ˆ์ œ

    places = [["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]]

    ์‹คํ–‰๊ฒฐ๊ณผ

    [1, 0, 1, 1, 1]

    โŒจ๏ธ ๋ฌธ์ œ ํ’€์ด

    1. ์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ดˆ๊ณผ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ์— ์‹ ๊ฒฝ์„ ์จ์•ผํ•œ๋‹ค.
      ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‘์‹œ์ž๋“ค์˜ ์ขŒํ‘œ๋งŒ ๋”ฐ๋กœ ๋ฐฐ์—ด๋กœ ๋ฐ›์•„์„œ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ ๋’ค ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๊ฐ€ 2 ์ดํ•˜์ธ ๊ฒƒ๋“ค๋งŒ BFS๋ฅผ ํ†ตํ•ด
      ์‘์‹œ์ž ์‚ฌ์ด๊ฐ€ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ง‰ํ˜€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    2. ๋Œ€๊ธฐ์‹ค์„ BFS๋กœ ๋Œ๋ฉด์„œ ํ์— ์ด๋™ ๊ฑฐ๋ฆฌ, ์ขŒํ‘œ, ์›€์ง์ธ ์ด๋™ ์ขŒํ‘œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋„ฃ์–ด ์ฃผ๋ฉฐ,
      ์ด๋™ ๊ฑฐ๋ฆฌ๊ฐ€ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋ณด๋‹ค ๋ฉ€๋‹ค๋ฉด BFS ๊ณผ์ •์„ skip ํ•œ๋‹ค.
    3. ๋‘ ์‘์‹œ์ž์˜ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๊ฐ€ 2 ์ดํ•˜์ผ ๋•Œ, ์‚ฌ์ด์— ํŒŒํ‹ฐ์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌ ํ•˜์ง€ ๋ชปํ•ด์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 5๋ฒˆ์ด ํ‹€๋ ธ๋‹ค.
      ๋‚ด๊ฐ€ ํ‹€๋ฆฐ ๋ฐ˜๋ก€๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋‹ต์€ 1์ด๋‹ค.
      [["OPXPO", "OOOOO", "OOOOO", "OOOOO", "OOOOO"]]   

    ๐Ÿ’พ ๋А๋‚€์ 

    • ์–ด์ œ ํ’€์—ˆ๋˜ ๋ถˆ! ๋ณด๋‹ค ์‰ฌ์› ๋‹ค.
    • ๋ฐ˜๋ก€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ฐพ๋Š”๋ฐ ์กฐ๊ธˆ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค.
    • BFS๋Š” ์งœ๊ธฐ ๋‚˜๋ฆ„์ธ ๊ฒƒ ๊ฐ™๋‹ค. queue ์— ๋„ฃ๋Š” ์ •๋ณด๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์ด ์ต์ˆ™ํ•ด์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ์ข‹๋‹ค.
      ๊ทธ๋Ÿฌ๋‚˜ visited ๋ฐฐ์—ด์„ ๋” ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์—ฐ์Šตํ•ด์•ผ๊ฒ ๋‹ค.
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.