๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€(BOJ)

[ ํŒŒ์ด์ฌ(python) ] ๋ฐฑ์ค€ 2615 - ์˜ค๋ชฉ

by YWTechIT 2021. 6. 3.
728x90

๐Ÿ“ ๋ฐฑ์ค€ 2615 - ์˜ค๋ชฉ

๋ฐฑ์ค€ 2615 - ์˜ค๋ชฉ


โšก๏ธ ๋‚˜์˜ ํ’€์ด

IndexError์™€ ๋‹จ๋ฝ์—ฐ์‚ฐ์ž์˜ ์ค‘์š”์„ฑ์„ ๋งค์šฐ ๋งค์šฐ ์ž˜ ๋ฐฐ์šด ๋ฌธ์ œ์˜€๋‹ค..(๊ทธ๋งŒํผ ๋งŽ์ด ์‹œ๋„ํ–ˆ๋‹ค..) ๊นŒ๋จน์ง€ ์•Š๊ฒŒ ์ •๋‹ต ํŒ์ •์„ ๋ฐ›๊ณ  ๋ฐ”๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ์ค‘์ด๋‹ค.

 

 

์ œ์ผ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์€ IndexError(๋ฒ”์œ„์„ค์ •), ์œก๋ชฉํŒ์ • ์ด๊ณ  ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฐ”๋‘‘์•Œ ์ฐพ๊ธฐ์˜€๋‹ค. ์ง€๊ธˆ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์ธ์ง€ ์ •ํ™•ํžˆ ๋ถ„์„ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ๋ฏธํกํ•ด์„œ ์•„์‰ฌ์› ๋‹ค. ํฐ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. 19 * 19 ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.
  2. ๋ฐ”๋‘‘์•Œ์ด ์žˆ๋Š” ๊ฐ’(arr[x][y]:)์„ ํ™•์ธํ•œ๋‹ค.
  3. ํ•˜, ์šฐํ•˜, ์šฐ, ์šฐ์ƒ ์ˆœ์„œ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.
  4. ํ˜„์žฌ ๊ฐ’๊ณผ ๋‹ค์Œ ๊ฐ’์ด ์—ฐ์†์œผ๋กœ ์žˆ๋Š”์ง€ while๋ฌธ์œผ๋กœ ํ™•์ธํ•œ๋‹ค.
  5. ์œก๋ชฉ ํŒ๋‹จ(ํ•˜๋‹จ ์ฐธ๊ณ )์„ ์ง„ํ–‰ํ•œ๋‹ค.
  6. ์œก๋ชฉ ํŒ๋‹จ์˜ ์กฐ๊ฑด์„ ์ง€๋‚ฌ๋Š”๋ฐ๋„ cnt == 5๋ฉด ์˜ค๋ชฉ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  return ํ•œ๋‹ค.
  7. ์Šน๋ถ€๊ฐ€ ๋‚˜์ง€ ์•Š์œผ๋ฉด 0์„ return ํ•œ๋‹ค.
728x90

๐Ÿค” Trial and Error

1๏ธโƒฃ IndexError
19๋ฒˆ ์ฝ”๋“œ๋ฅผ while 0 <= nx + dx[i] < n and 0 <= ny + dy[i] < n and arr[x][y] == arr[nx][ny]:์ฒ˜๋Ÿผ ์ž‘์„ฑํ–ˆ๋‹ค. ๋ฌผ๋ก  IndexError๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, ๋งŒ์•ฝ ํ˜„์žฌ cnt = 4์ด๊ณ  ๋‹ค์Œ cnt๋ฅผ ์…€ ์ฐจ๋ก€์ธ๋ฐ, ์—ฌ๊ธฐ์„œ + dx[i], + dy[i] ์นธ๋งŒํผ ๋” ๊ฐ€๋ฉด n์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

2๏ธโƒฃ ๋‹จ๋ฝ์—ฐ์‚ฐ์ž
์ฒ˜์Œ์— 23๋ฒˆ๊ณผ 25๋ฒˆ ๊ฐ๊ฐ ์ฝ”๋“œ ์ˆœ์„œ๋ฅผ ์•ž๋’ค๋กœ ๋ฐ”๊พธ์–ด์„œ ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค.(23๋ฒˆ: if arr[nx][ny] == arr[nx + dx[i]][ny + dy[i]] and 0 <= nx + dx[i] < n and 0 <= ny + dy[i] < n:, 25๋ฒˆ: if arr[x][y] == arr[x - dx[i]][y - dy[i]] and 0 <= x - dx[i] < n and 0 <= y - dy[i] < n:) ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋‹ˆ๊นŒ ์—ญ์‹œ IndexError๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ๋งŒ์•ฝ, ํ˜„์žฌ ์ขŒํ‘œ arr[x][y]๊ฐ€ index ๋งˆ์ง€๋ง‰ ์œ„์น˜(arr[n][n])์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๋‹ค์Œ ๋น„๊ตํ•  ์ขŒํ‘œ์ธ arr[nx + dx[i]][ny + dy[i]]๋Š” n์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ตํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋•Œ, ์•ž ๋’ค ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์•ž ์กฐ๊ฑด์ธ 0 <= nx + dx[i] < n and 0 <= ny + dy[i] < n:์— ๋จผ์ € ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๊ณ  ์ดํ›„ ๋‹จ๋ฝ ํ‰๊ฐ€์— ์˜ํ•ด ๋’ค ์กฐ๊ฑด์€ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ๊ณง๋ฐ”๋กœ False ์ฒ˜๋ฆฌํ•œ๋‹ค. 25๋ฒˆ ์ฝ”๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ๋‹จ๋ฝ ํ‰๊ฐ€๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์ด์ „ ๊ธ€์„ ๋ณด์ž!

 

3๏ธโƒฃ ์œก๋ชฉ ํŒ๋‹จ
์—ฐ์†๋œ ๋ฐ”๋‘‘์•Œ์ด ์œก๋ชฉ์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์—ฐ์†๋œ ๋ฐ”๋‘‘์•Œ์˜ ์ œ์ผ ๋งˆ์ง€๋ง‰ ์ขŒํ‘œ์™€ ํ•ด๋‹น ์ขŒํ‘œ์—์„œ ํ•œ ์นธ(+ dx[i], + dy[i]) ๋” ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ€ ๊ฐ™์€์ง€ ์‚ดํŽด๋ณด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์ œ์ผ ์ฒ˜์Œ ์ขŒํ‘œ์™€ ํ•ด๋‹น ์ขŒํ‘œ์—์„œ ํ•œ ์นธ(- dx[i], - dy[i]) ๋œ ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ€ ๊ฐ™์€์ง€ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ๋ง์ด ๋ณต์žกํ•œ ๊ฒƒ ๊ฐ™์•„๋ณด์—ฌ ํ•˜๋‹จ์— ํ‘œ๋ฅผ ์ง์ ‘ ๊ทธ๋ ค๋ดค๋‹ค.

 

 

4๏ธโƒฃ return ์ธ์ž ๊ฐœ์ˆ˜
์Šน๋ถ€๊ฐ€ ๋‚ฌ์„ ๋•Œ returnํ•˜๋Š” ์ธ์ž์˜ ๊ฐœ์ˆ˜์™€ ์Šน๋ถ€๊ฐ€ ๋‚˜์ง€ ์•Š์•˜์„ ๋•Œ returnํ•˜๋Š” ์ธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ž๋‹ค. ๊ทธ๋ž˜์„œ return๊ณผ print()๋ฅผ ๊ฐ๊ฐ ์‚ฌ์šฉํ•˜๋ ค๋‹ค๊ฐ€ ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„ ํ•˜๋‚˜๋งŒ returnํ•˜๋Š” ์ธ์ž์— ์ž„์˜๋กœ -1, -1์„ ๋ถ™์—ฌ 3๊ฐœ๋กœ ๋งž์ท„๊ณ , 0์„ returnํ•œ ๊ฐ’์—๋Š” 0๋งŒ ์ถœ๋ ฅํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉฐ ์ž‘์„ฑํ•œ T.C๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ ธ์™”๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์•ˆ ํ’€๋ฆฐ๋‹ค๋ฉด ํ…Œ์ŠคํŠธํ•ด๋ณด์ž. (19 * 19๋กœ ๋งŒ๋“ค๊ธฐ ๊ท€์ฐฎ์•„์„œ 6 * 6๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.)

'''
@ input
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
0 0 0 0 0 0
2 2 2 2 2 1

@ output
2
6 1
'''

์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ด 3์ผ์ด ๊ฑธ๋ ธ๋Š”๋ฐ, ์˜ค๋Š˜ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ๋“ค์„ ์–ธ์  ๊ฐ„ ์จ๋จน์„ ์ˆ˜ ์žˆ๊ฒŒ ์žŠ์ง€ ๋ง์•„์•ผ๊ฒ ๋‹ค.

n = 19
arr = [list(map(int, input().split())) for _ in range(n)]

dx = [1, 1, 0, -1]  # ํ•˜(↓), ์šฐํ•˜(โฌŠ), ์šฐ(โžž), ์šฐ์ƒ(โฌˆ)
dy = [0, 1, 1, 1]    

def omok():
    for x in range(n):
        for y in range(n):
            if arr[x][y]:
                for i in range(4):
                    nx = x + dx[i]
                    ny = y + dy[i]
                    cnt = 1

                    if nx < 0 or ny < 0 or nx >= n or ny >= n:
                        continue

                    while 0 <= nx < n and 0 <= ny < n and arr[x][y] == arr[nx][ny]:
                        cnt += 1

                        if cnt == 5:
                            if 0 <= nx + dx[i] < n and 0 <= ny + dy[i] < n and arr[nx][ny] == arr[nx + dx[i]][ny + dy[i]]:  # ์œก๋ชฉ ํŒ์ • 1
                                break
                            if 0 <= x - dx[i] < n and 0 <= y - dy[i] < n and arr[x][y] == arr[x - dx[i]][y - dy[i]]:  # ์œก๋ชฉ ํŒ์ • 2
                                break
                            return arr[x][y], x+1, y+1  # ์œก๋ชฉ์ด ์•„๋‹Œ ์˜ค๋ชฉ์ด๋ฉด return

                        nx += dx[i]
                        ny += dy[i]
    return 0, -1, -1  # ์Šน๋ถ€๊ฐ€ ๋‚˜์ง€ ์•Š์„ ๋•Œ

color, x, y = omok()
if not color:
    print(color)
else:
    print(color)
    print(x, y)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€