ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 1799 λΉ„μˆ with Python
    PS 2021. 10. 11. 21:44
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 1799 λΉ„μˆ

    πŸ’‘ 쑰건 및 풀이

    1. 체슀판의 ν¬κΈ°λŠ” 10 μ΄ν•˜μ˜ μžμ—°μˆ˜
    2. λΉ„μˆμ„ 놓을 수 μžˆλŠ” κ³³μ—λŠ” 1, λΉ„μˆμ„ 놓을 수 μ—†λŠ” κ³³μ—λŠ” 0
    3. λŒ€κ°μ„  λ°©ν–₯으둜 μ›€μ§μ΄λŠ” λΉ„μˆμ΄ 이동할 수 μžˆλŠ” κ²½λ‘œμ— λΉ„μˆμ„ 놓을 수 μ—†λ‹€.
    4. λ°±νŠΈλž˜ν‚Ή μœ ν˜•μ˜ 문제

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

    from sys import stdin
    
    n = int(stdin.readline())
    
    chess_map = []
    black = []
    white = []
    color = [[0] * n for _ in range(n)]
    
    for i in range(n):
        for j in range(n):
            color[i][j] = (i % 2 == 0 and j % 2 == 0) or (i % 2 != 0 and j % 2 != 0)
    
    for i in range(n):
        chess_map.append(list(map(int, input().split())))
        for j in range(n):
            # Trueκ°€ 검은색
            if chess_map[i][j] == 1 and color[i][j] == 1:
                black.append((i, j))
            # Falseκ°€ 흰색
            if chess_map[i][j] == 1 and color[i][j] == 0:
                white.append((i, j))
    
    # 검은색인 경우
    Bcnt = 0
    # 흰색인 경우
    Wcnt = 0
    
    isused01 = [0] * (n * 2 - 1)
    isused02 = [0] * (n * 2 - 1)
    
    
    def fun(bishop, index, count):
        global Bcnt, Wcnt
        if index == len(bishop):
            rx, ry = bishop[index - 1]
            # λΈ”λž™μ΄λ©΄ Bcnt μ΅œλŒ€κ°’
            if color[rx][ry]:
                Bcnt = max(Bcnt, count)
            # 흰색이면 Wcnt μ΅œλŒ€κ°’
            else:
                Wcnt = max(Wcnt, count)
            return
    
        x, y = bishop[index]
        if isused01[x + y] or isused02[x - y + n - 1]:
            fun(bishop, index + 1, count)
        else:
            isused01[x + y] = 1
            isused02[x - y + n - 1] = 1
            fun(bishop, index + 1, count + 1)
            isused01[x + y] = 0
            isused02[x - y + n - 1] = 0
            fun(bishop, index + 1, count)
    
    
    if len(black) > 0:
        fun(black, 0, 0)
    if len(white) > 0:
        fun(white, 0, 0)
    print(Bcnt + Wcnt)

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

    예제

    5
    1 1 0 1 1
    0 1 0 0 0
    1 0 1 0 1
    1 0 0 0 0
    1 0 1 1 1

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

    7

    ⌨️ 문제 풀이

    1. 흑과 백을 ꡬ뢄할 수 μžˆλŠ” μ²΄μŠ€νŒμ„ True 와 False λ₯Ό μ‚¬μš©ν•΄ λ‹€μ‹œ λ§Œλ“ λ‹€.
    2. λΉ„μˆμ„ 놓을 수 μžˆλŠ” μ’Œν‘œλ₯Ό 흑과 백으둜 λ‚˜λˆ„μ–΄ 각각 black κ³Ό white λ¦¬μŠ€νŠΈμ— λ„£μ–΄μ€€λ‹€.
    3. λΉ„μˆμ„ 놓고, 놓을 수 μ—†λŠ” 곳을 ν‘œμ‹œν•  λ•Œ μ‚¬μš©ν•  isused 리슀트λ₯Ό μƒμ„±ν•œλ‹€.
    4. μž¬κ·€ν•¨μˆ˜λ₯Ό 타고 각 μ’Œν‘œμ— ν•΄λ‹Ήν•˜λŠ” 곳이 isused01, isused02 λͺ¨λ‘ μ‚¬μš© μ€‘μ΄κ±°λ‚˜
      놓을 수 μ—†λŠ” 자리라면 indexλ₯Ό ν•˜λ‚˜ 늘리고 λ‹€μ‹œ μž¬κ·€.
    5. 4λ²ˆμ— ν•΄μž₯ν•˜μ§€ μ•ŠμœΌλ©΄ λΉ„μˆμ„ 놓고 놓은 λΉ„μˆ κ°œμˆ˜μ™€ indexλ₯Ό 1μ”© 늘리고 μž¬κ·€
    6. μž¬κ·€λ₯Ό λΉ μ Έλ‚˜μ˜€λ©΄ 직전에 λ†“μ•˜λ˜ λΉ„μˆμ˜ 정보λ₯Ό μ œκ±°ν•˜κ³  λ‹€μŒ μ’Œν‘œλ‘œ λ„˜μ–΄κ°€κΈ° μœ„ν•΄ index + 1 ν•˜κ³  μž¬κ·€
    7. index값이 흰색 ν˜Ήμ€ 검정색 λΉ„μˆ μ’Œν‘œμ˜ 길이와 κ°™λ‹€λ©΄ κ²€μ •μƒ‰μ˜ μ΅œλŒ“κ°’κ³Ό ν°μƒ‰μ˜ μ΅œλŒ“κ°’μ„ 각각 Bcnt와 Wcnt에 μ €μž₯ν•œλ‹€.

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

    • 무지성 λ°±νŠΈλž˜ν‚ΉμœΌλ‘œ ν’€λ €λ‹€κ°€ μ‹œκ°„μ΄ˆκ³Όκ°€ λ–΄λ‹€.
    • λ°±νŠΈλž˜ν‚Ήμ„ μž˜ν•˜λ €λ©΄ μž¬κ·€λ₯Ό 잘 지쀄 μ•Œμ•„μ•Όν•˜λŠ”λ° 아직도 μž¬κ·€ν•¨μˆ˜κ°€ 약점이닀.
    • 흑, λ°± 칸을 ꡬ뢄지어 κ΅¬ν˜„ν•˜λŠ”λ°μ—λ„ ν—·κ°ˆλ¦¬λŠ” 뢀뢄이 μžˆμ—ˆλ‹€.
    • ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜κ³ μ„œλ„ 이해가 μ•ˆλ˜λŠ” 뢀뢄이 μžˆμ–΄μ„œ λ³„ν‘œλ₯Ό 많이 쳐놨닀.
    • λ‹€μ‹œλŠ” ν’€κ³  싢지 μ•Šμ€ μœ ν˜•μ΄μ§€λ§Œ, κ·Έλž˜λ„ μ˜›λ‚ λ³΄λ‹€λŠ” λ‚˜μ•„μ§€λŠ” λŠλ‚Œμ„ λ°›λŠ”λ‹€.
      λ‹€μ‹œ 풀어봐야겠닀.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.