ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 3184 μ–‘ with Python
    PS 2021. 10. 19. 22:21
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 3184 μ–‘

    πŸ’‘ 쑰건

    1. Rκ³Ό Cκ°€ 주어지며(3 ≀ R, C ≀ 250), 각 μˆ˜λŠ” λ§ˆλ‹Ήμ˜ ν–‰κ³Ό μ—΄μ˜ 수λ₯Ό μ˜λ―Έν•œλ‹€.
      R개의 쀄은 C개의 κΈ€μžλ₯Ό 가진닀. 이듀은 λ§ˆλ‹Ήμ˜ ꡬ쑰(μšΈνƒ€λ¦¬, μ–‘, λŠ‘λŒ€μ˜ μœ„μΉ˜)λ₯Ό μ˜λ―Έν•œλ‹€.

    2. κΈ€μž '.' (점)은 빈 ν•„λ“œλ₯Ό μ˜λ―Έν•˜λ©°, κΈ€μž '#'λŠ” μšΈνƒ€λ¦¬λ₯Ό, 'o'λŠ” μ–‘, 'v'λŠ” λŠ‘λŒ€λ₯Ό μ˜λ―Έν•œλ‹€.

    3. ν•œ μΉΈμ—μ„œ μˆ˜ν‰, 수직만으둜 μ΄λ™ν• μˆ˜ μžˆλ‹€.
      μ˜μ—­ μ•ˆμ˜ μ–‘μ˜ μˆ˜κ°€ λŠ‘λŒ€μ˜ μˆ˜λ³΄λ‹€ λ§Žλ‹€λ©΄ 이기고, λŠ‘λŒ€κ°€ 많으면 양은 사라진닀.

    4. 넓이 μš°μ„  탐색(BFS) μ•Œκ³ λ¦¬μ¦˜ μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    from collections import deque
    
    n, m = map(int, stdin.readline().split())
    board = []
    for n in range(n):
        board.append(list(stdin.readline().rstrip()))
    dx, dy = [1, -1, 0, 0], [0, 0, -1, 1]
    visited = set()
    
    
    def bfs(x, y):
        vo = [set(), set()]
        q = deque()
        q.append((x, y))
        visited.add((x, y))
        while q:
            x, y = q.popleft()
    
            if board[x][y] == 'o':
                vo[1].add((x, y))
            elif board[x][y] == 'v':
                vo[0].add((x, y))
    
            for i in range(4):
                nx, ny = dx[i] + x, dy[i] + y
                if -1 < nx < n and -1 < ny < m:
                    if board[nx][ny] != '#' and (nx, ny) not in visited:
                        q.append((nx, ny))
                        visited.add((nx, ny))
    
        if len(vo[0]) < len(vo[1]):
            return 0, len(vo[1])
        else:
            return len(vo[0]), 0
    
    
    answer = [0, 0]
    for i in range(n):
        for j in range(m):
            if (board[i][j] == 'v' or board[i][j] == 'o') and (i, j) not in visited:
                v, o = bfs(i, j)
    
                answer[0] += o
                answer[1] += v
    
    print(*answer)

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    6 6
    ...#..
    .##v#.
    #v.#.#
    #.o#.#
    .###.#
    ...###

    μ‹€ν–‰κ²°κ³Ό

    0 2

    ⌨️ 문제 풀이

    1. μ–‘κ³Ό λŠ‘λŒ€μ˜ 수λ₯Ό 담을 answer 리슀트λ₯Ό 각각의 μ›μ†Œλ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•˜μ—¬ μƒμ„±ν•œλ‹€.
      이미 λ°©λ¬Έν–ˆλ˜ 곳의 μ’Œν‘œλ₯Ό 담을 set μžλ£Œν˜• visitedλ₯Ό μƒμ„±ν•œλ‹€.

    2. 이쀑 반볡문으둜 ν•„λ“œλ₯Ό μˆœνšŒν•˜λ©΄μ„œ, λ‹€μŒ 두가지에 ν•΄λ‹Ήν•˜λ©΄ BFSλ₯Ό μˆ˜ν–‰ν•œλ‹€.

      1. (i, j) κ°€ visited 에 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μ„ λ•Œ
      2. (i, j) 에 ν•΄λ‹Ήν•˜λŠ” ν•„λ“œ 값이 v ν˜Ήμ€ o 일 λ•Œ
    3. bfs ν•¨μˆ˜μ—μ„œ voλΌλŠ” set()이 λ‘κ°œ λ‹΄κΈ΄ 리슀트λ₯Ό 생성해쀀닀.
      νμ—λŠ” bfs λ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ λ°›μ•„μ˜¨ x, y 값을 λ„£μ–΄μ£Όκ³ , 큐가 빌 λ•ŒκΉŒμ§€ μˆ˜ν–‰ν•œλ‹€.

    4. νμ—μ„œ 뽑아낸 x, y μ’Œν‘œκ°€ ν•„λ“œμ—μ„œ 양인지 λŠ‘λŒ€μΈμ§€ κ΅¬λ¬Έν•˜μ—¬ vo\[1\] ν˜Ήμ€ v\[0\] 에 μ €μž₯ν•΄μ€€λ‹€.
      ν˜„μž¬ μ’Œν‘œμ—μ„œ μƒν•˜μ’Œμš°λ₯Ό μˆœνšŒν•˜λ©° λ°©λ¬Έν•˜μ§€ μ•Šμ•˜κ³ , #이 μ•„λ‹Œ ν•„λ“œμ˜ μ’Œν‘œλ₯Ό 큐와 visited 에 λ„£μ–΄μ€€λ‹€.

    5. 큐가 λΉ„μ–΄ while 반볡문이 μ’…λ£Œλ˜λ©΄, μ–‘μ˜ μˆ˜μ™€ λŠ‘λŒ€μ˜ 수λ₯Ό λΉ„κ΅ν•˜μ—¬
      μˆ˜κ°€ 더 μž‘μ€ μͺ½μ€ 0으둜, 큰 μͺ½μ€ 숫자 κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.

    6. bfs ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λ°›μ€ 값을 answer μ›μ†Œμ— 각각 더해쀀닀.

    πŸ’Ύ λŠλ‚€μ 

    1. BFS λ¬Έμ œμ˜€κ³ , μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€.
    2. λ‹€λ₯Έ μ‚¬λžŒμ΄ λ‚΄ 글을 보고 잘 이해할 수 μžˆμ„μ§€λŠ” λͺ¨λ₯΄κ² λ‹€.
    3. 쑰금 더 μ‰½κ²Œ μ„€λͺ…ν•  수 있게 더 높은 μˆ˜μ€€μ˜ 이해가 ν•„μš”ν•  것 κ°™λ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.