ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 2615 였λͺ© with Python
    PS 2021. 12. 12. 17:42
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 2615 였λͺ©

    πŸ’‘ 쑰건

    1. λ°”λ‘‘νŒμ—λŠ” 19개의 κ°€λ‘œμ€„κ³Ό 19개의 μ„Έλ‘œμ€„μ΄ κ·Έλ €μ Έ μžˆλ‹€. board의 ν¬κΈ°λŠ” 19 * 19
    1. 검은 λ°”λ‘‘μ•Œμ€ 1, 흰 λ°”λ‘‘μ•Œμ€ 2, μ•Œμ΄ 놓이지 μ•ŠλŠ” μžλ¦¬λŠ” 0으둜 ν‘œμ‹œ
    1. κ°€λ‘œ, μ„Έλ‘œ λ˜λŠ” λŒ€κ°μ„  λ°©ν–₯ λͺ¨λ‘ ν¬ν•¨ν•΄μ„œ 같은 μƒ‰μ˜ λ°”λ‘‘λŒμ΄ 5개 놓여져 μžˆλ‹€λ©΄ μŠΉλ¦¬ν•œλ‹€.
      5개 초과 λ˜λŠ” 미만의 κ°œμˆ˜λŠ” μŠΉλ¦¬ν•  수 μ—†λ‹€
    1. 검은색이 μ΄κ²ΌλŠ”μ§€, 흰색이 μ΄κ²ΌλŠ”μ§€ λ˜λŠ” 아직 μŠΉλΆ€κ°€ κ²°μ •λ˜μ§€ μ•Šμ•˜λŠ”μ§€λ₯Ό νŒλ‹¨ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±.
      검은색이 이겼을 κ²½μš°μ—λŠ” 1을, 흰색이 이겼을 κ²½μš°μ—λŠ” 2λ₯Ό, 아직 μŠΉλΆ€κ°€ κ²°μ •λ˜μ§€ μ•Šμ•˜μ„ κ²½μš°μ—λŠ” 0을 좜λ ₯
    1. 은색 λ˜λŠ” 흰색이 이겼을 κ²½μš°μ—λŠ” λ‘˜μ§Έ 쀄에 μ—°μ†λœ λ‹€μ„― 개의 λ°”λ‘‘μ•Œ μ€‘μ—μ„œ κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” λ°”λ‘‘μ•Œμ˜ κ°€λ‘œμ€„, μ„Έλ‘œμ€„ 번호λ₯Ό 좜λ ₯ν•œλ‹€.
      • μ„Έλ‘œλ‘œ 놓인 경우, κ·Έ 쀑 κ°€μž₯ μœ„μ— μžˆλŠ” λ°”λ‘‘μ•Œμ˜ κ°€λ‘œ, μ„Έλ‘œμ€„ 번호λ₯Ό 좜λ ₯ν•œλ‹€.
    1. 브루트포슀 μ•Œκ³ λ¦¬μ¦˜ & κ΅¬ν˜„ μœ ν˜•μ˜ 문제

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

    from sys import stdin
    
    dx, dy = [0, 1, 1, 1], [1, 0, -1, 1]
    
    board = []
    visited = [set() for _ in range(4)]
    
    for i in range(19):
        board.append(list(map(int, stdin.readline().split())))
    
    
    def check(code, i, j):
        for z in range(4):
            cnt = 1
            res = set()
            res.add((i, j))
    
            nx, ny = i + dx[z], j + dy[z]
    
            while 1:
                if 0 <= nx < 19 and 0 <= ny < 19:
                    if board[nx][ny] == code and ((nx, ny) not in visited[z]):
                        cnt += 1
                        res.add((nx, ny))
                        visited[z].add((nx, ny))
                        nx += dx[z]
                        ny += dy[z]
                    else:
                        if cnt == 5:
                            return list(res)
                        else:
                            break
                else:
                    if cnt == 5:
                        return list(res)
                    break
        return []
    
    
    def solve():
        for i in range(19):
            for j in range(19):
                if board[i][j] == 1:
                    v = check(1, i, j)
                    if v:
                        return 1, v
                elif board[i][j] == 2:
                    v = check(2, i, j)
                    if v:
                        return 2, v
        return 0, False
    
    
    code, v = solve()
    if v is False:
        print(0)
    else:
        tf = 1
        x = v[0][1]
        for i in range(1, 5):
            if x != v[i][1]:
                tf = 0
                break
    
        if tf:
            v.sort(key=lambda x: (x[0]))
            print(code)
            print(*(v[0][0] + 1, v[0][1] + 1))
        else:
            print(code)
            v.sort(key=lambda x: (x[1]))
            print(*(v[0][0] + 1, v[0][1] + 1))

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

    예제

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0
    0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
    0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

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

    1
    3 2

    ⌨️ 문제 풀이

    1. λ°”λ‘‘νŒμ€ 19 * 19의 크기둜 μ œν•œλ˜μ–΄ μžˆλ‹€. solve() ν•¨μˆ˜μ—μ„œ 이쀑 반볡문으둜 λ°”λ‘‘νŒμ˜ 칸을 λͺ¨λ‘ μˆœνšŒν•œλ‹€.
    1. μˆœνšŒν•˜λ©΄μ„œ 검은 λ°”λ‘‘λŒμ΄ 놓여진 κ³³κ³Ό 흰 λ°”λ‘‘μ•Œμ΄ 놓여진 곳을 λ°œκ²¬ν•˜κ²Œ λœλ‹€λ©΄, check() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.
      • check(돌의 색, x μ’Œν‘œ, y μ’Œν‘œ)
        의 ν˜•μ‹μœΌλ‘œ ν˜ΈμΆœν•˜μ—¬ λ°˜ν™˜ 받은 κ²°κ³Όκ°€ 빈 배열이 μ•„λ‹ˆλΌλ©΄, 이긴 λ°”λ‘‘ 돌의 μƒ‰μ˜ λ²ˆν˜Έμ™€ λ°”λ‘‘λŒμ˜ μ’Œν‘œλ“€μ„ λ°˜ν™˜ν•œλ‹€.
    1. check() ν•¨μˆ˜λŠ” 였λ₯Έμͺ½, μ•„λž˜, 쒌츑 μ•„λž˜, 우츑 μ•„λž˜μ˜ λ„€ λ°©ν–₯을 κ²€μ‚¬ν•œλ‹€.
      μž…λ ₯받은 μ’Œν‘œλ₯Ό κΈ°μ€€μœΌλ‘œ μœ„μ—μ„œ λ§ν•œ λ„€ λ°©ν–₯을 κ²€μ‚¬ν•˜λ©΄μ„œ, λ„˜κ²¨λ°›μ€ λ°”λ‘‘λŒμ˜ 색깔과 μΌμΉ˜ν•˜λŠ” 돌이 μžˆλ‹€λ©΄
      res 집합 μžλ£Œν˜• λ³€μˆ˜μ— λ„£μ–΄μ£Όκ³ , 5κ°œμΈμ§€ ν™•μΈν•˜μ—¬ λ§žλ‹€λ©΄ resλ₯Ό list둜 λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜, μ•„λ‹ˆλΌλ©΄ λ°˜λ³΅λ¬Έμ„ μ’…λ£Œν•œλ‹€.
    1. solve() ν•¨μˆ˜ 호좜 ν›„ μž‘μ—…μ΄ 끝났닀면, code 와 vλ₯Ό λ°˜ν™˜λ°›κ²Œ λ˜λŠ”λ°,
      codeλŠ” 이긴 λ°”λ‘‘λŒμ„ λœ»ν•˜λ©° vλŠ” λ°”λ‘‘λŒμ˜ μ’Œν‘œλ“€μ„ λœ»ν•œλ‹€.
    1. μ„Έλ‘œλ‘œ μ„Έμ›Œμ§„ λ°”λ‘‘λŒμΈμ§€ 확인 ν•œ ν›„, tf의 값에 따라 vλ₯Ό μ •λ ¬ν•˜κ³  이긴 λ°”λ‘‘λŒμ˜ 색과 μ’Œν‘œλ₯Ό 좜λ ₯ν•œλ‹€.
      tf κ°€ 1일 λ•Œ, μ„Έλ‘œλ‘œ 놓여진 λ‹€μ„―κ°œμ˜ λ°”λ‘‘λŒμ΄λ‹€.
      tf κ°€ 0일 λ•Œ, μ„Έλ‘œκ°€ μ•„λ‹Œ λ°©ν–₯으둜 놓여진 λ°”λ‘‘λŒμ΄λ‹€.

    2. solve() ν•¨μˆ˜μ— λ°˜ν™˜λ°›μ€ vκ°€ False 라면 λ¬΄μŠΉλΆ€μ΄κΈ° λ•Œλ¬Έμ— 0을 좜λ ₯ν•œλ‹€.

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

    1. λ°”λ‘‘λŒμ΄ μ—¬μ„―κ°œ 일 λ•Œ 쑰건문을 톡해 κ±ΈλŸ¬λ‚΄λŠ” λ²•μ—μ„œ ν—€λ§Έλ‹€.

    2. κ΅¬ν˜„μ„ ν•  λ•Œ 쑰금 더 꼼꼼히 μƒκ°ν•΄λ³΄μž.

    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.