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

[๋ฐฑ์ค€] 2072 ์˜ค๋ชฉ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 12. 28.

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

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

 

2072๋ฒˆ: ์˜ค๋ชฉ

19x19ํฌ๊ธฐ์˜ ๋ฐ”๋‘‘ํŒ์—, ๋Œ์„ ๋†“์„ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ด ๊ฒŒ์ž„์ด ๋ช‡ ์ˆ˜๋งŒ์— ๋๋‚˜๋Š” ์ง€๋ฅผ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋‘‘ํŒ์˜ ๋ชจ์–‘์€ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์œผ๋ฉฐ, (1, 1)์ด ๊ฐ€์žฅ ์™ผ์ชฝ ์œ„์˜ ์ขŒํ‘œ์ด๊ณ  (19

www.acmicpc.net

 

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

1. ์˜ค๋ชฉ ์—ฌ๋ถ€ ๊ฒ€์ฆ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ˆ˜๋ฅผ ๋‘˜ ๋•Œ๋งˆ๋‹ค ๊ฒ€์ฆํ•˜๋ฉด ๋œ๋‹ค

2. ํ–‰, ์—ด, ๋‘ ๋Œ€๊ฐ์„ ์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

3. ์œก๋ชฉ์ด๋ž‘ 0 index ์กฐ์‹ฌํ•˜๊ธฐ

4. bfs๋‚˜ dfs ํ˜น์€ ๊ทธ๋ƒฅ ๋ธํƒ€ ํƒ์ƒ‰์œผ๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ƒ๊ฐํ•˜๊ธฐ ๊ท€์ฐฎ์•„์„œ ๋นก๊ตฌํ˜„์œผ๋กœ ํ’€์—ˆ๋‹ค(์ฝ”๋“œ๋Š” ์ „์ž๊ฐ€ ๋” ๊น”๋”ํ•˜๋‹ค)

 

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

import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 221224 2072 ์˜ค๋ชฉ

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


# ์˜ค๋ชฉ ์—ฌ๋ถ€ ํ™•์ธ ํ•จ์ˆ˜
def check_five(r, c):
    
    num = board[r][c]

    # ํ–‰ ๊ฒ€์ฆ
    max_len = 0
    cnt = 0
    for i in range(r - 4, r + 5):
        if 0 <= i < 19:
            if board[i][c] == num:
                cnt += 1
                max_len = max(cnt, max_len)
            else:
                cnt = 0

    if max_len == 5:
        return True

    # ์—ด ๊ฒ€์ฆ
    max_len = 0
    cnt = 0
    for i in range(c - 4, c + 5):
        if 0 <= i < 19:
            if board[r][i] == num:
                cnt += 1
                max_len = max(cnt, max_len)
            else:
                cnt = 0

    if max_len == 5:
        return True

    # ์ขŒ์ƒ -> ์šฐํ•˜ ๋Œ€๊ฐ์„ 
    max_len = 0
    cnt = 0
    for i in range(-4, 5):
        if 0 <= r + i < 19 and 0 <= c + i < 19:
            if board[r + i][c + i] == num:
                cnt += 1
                max_len = max(cnt, max_len)
            else:
                cnt = 0
    
    if max_len == 5:
        return True

    # ์šฐ์ƒ -> ์ขŒํ•˜ ๋Œ€๊ฐ์„ 
    max_len = 0
    cnt = 0
    for i in range(-4, 5):
        if 0 <= r + i < 19 and 0 <= c - i < 19:
            if board[r + i][c - i] == num:
                cnt += 1
                max_len = max(cnt, max_len)
            else:
                cnt = 0

    if max_len == 5:
        return True

    # ์˜ค๋ชฉ ์•„๋‹ ์‹œ False ๋ฐ˜ํ™˜
    return False
    


# board: ์˜ค๋ชฉํŒ
board = [[0 for _ in range(19)] for _ in range(19)]

# N: ์˜ค๋ชฉ ๋Œ ๋‘” ํšŸ์ˆ˜
N = int(input())

for i in range(1, N + 1):

    # r, c: ๋ฐ”๋‘‘๋Œ ์œ„์น˜
    r, c = map(int, input().split())
    # 0 ์ธ๋ฑ์Šค ๋ณ€ํ™˜
    r -= 1
    c -= 1

    if i % 2:
        board[r][c] = 1
    else:
        board[r][c] = 2

    # ์˜ค๋ชฉ์ด ๋  ๊ฒฝ์šฐ ์ˆ˜ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if check_five(r, c):
        print(i)
        exit()

# ์ŠนํŒจ ์•ˆ ๋‚œ ๊ฒฝ์šฐ
print(-1)

๋Œ“๊ธ€