๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1799 ๋น„์ˆ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 6. 5.

<๋ฌธ์ œ ๋งํฌ>

https://www.acmicpc.net/problem/1799

 

1799๋ฒˆ: ๋น„์ˆ

์ฒซ์งธ ์ค„์— ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ๋Š” 10์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ์•„๋ž˜์˜ ์˜ˆ์™€ ๊ฐ™์ด ์ฒด์ŠคํŒ์˜ ๊ฐ ์นธ์— ๋น„์ˆ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฒด์ŠคํŒ ํ•œ ์ค„ ๋‹จ์œ„๋กœ

www.acmicpc.net

 

<ํ’€์ด ์ „๋žต>

1. ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ‘ธ๋Š” ๋ฌธ์ œ์ง€๋งŒ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ์•„์ด๋””์–ด๊ฐ€ ํ•„์š”ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

2. ๋Œ€๊ฐ์„ ์œผ๋กœ๋งŒ ์›€์ง์ด๋Š” ๋น„์ˆ์˜ ํŠน์ง•์„ ๊ณ ๋ คํ•  ๋•Œ ๊ฒ€์€์ƒ‰ ์นธ์— ๋†“์ธ ๋น„์ˆ์€ ๊ฒ€์€์ƒ‰ ์นธ์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ณ  ํ•˜์–€์ƒ‰ ์นธ์— ๋†“์ธ ๋น„์ˆ์€ ํ•˜์–€์ƒ‰ ์นธ์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋”ฐ๋ผ์„œ ๊ฒ€์€์ƒ‰๊ณผ ํ•˜์–€์ƒ‰ ๊ฐ๊ฐ์˜ ์นธ์— ๋Œ€ํ•ด ๋น„์ˆ์„ ๋†“๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๊ตฌํ•ด์„œ ๋”ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

<์ •๋‹ต ์ฝ”๋“œ>

# 220927 1799 ๋น„์ˆ

# ์ •๋‹ต์ฝ”๋“œ

# N: ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ, chess: ์ฒด์ŠคํŒ์˜ ์ดˆ๊ธฐ ์ƒํƒœ
N = int(input())
chess = [list(map(int, input().split())) for _ in range(N)]

# visited_diagonal 1, 2: ์ขŒ -> ์šฐ, ์šฐ ->์ขŒ ๋Œ€๊ฐ์„  ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ‘œ์‹œ ๋ฐฐ์—ด 
visited_diagonal_1 = [0 for _ in range(2 * N)]
visited_diagonal_2 = [0 for _ in range(2 * N)]

# black, white: ๋น„์ˆ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ฒด์ŠคํŒ ์ƒ‰๊น”์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•œ ์ขŒํ‘œ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด
black = []
white = []
for r in range(N):
    for c in range(N):
        if chess[r][c]:
            if (r + c) % 2:
                black.append((r, c))
            else:
                white.append((r, c))


# ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๋น„์ˆ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜ ์ƒ‰๊น”๋ณ„๋กœ ๊ณ„์‚ฐ
def back_tracking(depth, cnt, candidates):
    global result
    
    # ํ•ด๋‹น ์ƒ‰๊น” ๋‚ด์˜ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋ฅผ ๋‹ค ๊ฒ€์ฆํ–ˆ์„ ๊ฒฝ์šฐ ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹  ํ›„ ๋ฐ˜ํ™˜
    if depth == len(candidates):
        result = max(result, cnt)
        return
    
    # r, c: ๋น„์ˆ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•  ์œ„์น˜์˜ ์ขŒํ‘œ
    r, c = candidates[depth]
    
    # ํ•ด๋‹น ์œ„์น˜์— ๋น„์ˆ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
    if visited_diagonal_1[r + c] == 0 and visited_diagonal_2[r - c + N] == 0:
        # ๋Œ€๊ฐ์„  ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ‘œ์‹œ
        visited_diagonal_1[r + c] = 1
        visited_diagonal_2[r - c + N] = 1
        
        # ๋‹ค์Œ ์œ„์น˜ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ ์ง„ํ–‰
        back_tracking(depth + 1, cnt + 1, candidates)
        
        # ๋ฐฑํŠธ๋ž˜ํ‚น
        visited_diagonal_1[r + c] = 0
        visited_diagonal_2[r - c + N] = 0

    # ๋†“์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋†“์ง€ ์•Š๊ณ  ๋‹ค์Œ ์œ„์น˜ ํƒ์ƒ‰ ์ง„ํ–‰
    back_tracking(depth + 1, cnt, candidates)


# result: ํ•ด๋‹น ์ƒ‰์—์„œ ๋น„์ˆ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜

# ํ‘๊ณผ ๋ฐฑ์— ๋Œ€ํ•ด ๊ฐ๊ฐ ๊ตฌํ•ด์„œ ์ •๋‹ต์— ๋”ํ•ด์ค€๋‹ค.
result = 0
back_tracking(0, 0, black)
ans = result

result = 0
back_tracking(0, 0, white)
ans += result

# ์ •๋‹ต ์ถœ๋ ฅ
print(ans)

๋Œ“๊ธ€