๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/BaekJoon

[Algorithm] BaekJoon : 2580. ์Šค๋„์ฟ  by Python

by ํฌ๊ตฌ๋ฆฌ 2021. 2. 16.

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช…

์Šค๋„์ฟ ๋Š” 18์„ธ๊ธฐ ์Šค์œ„์Šค ์ˆ˜ํ•™์ž๊ฐ€ ๋งŒ๋“  '๋ผํ‹ด ์‚ฌ๊ฐํ˜•'์ด๋ž‘ ํผ์ฆ์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์œผ๋กœ ํ˜„์žฌ ๋งŽ์€ ์ธ๊ธฐ๋ฅผ ๋ˆ„๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฐ€๋กœ, ์„ธ๋กœ ๊ฐ๊ฐ 9๊ฐœ์”ฉ ์ด 81๊ฐœ์˜ ์ž‘์€ ์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ •์‚ฌ๊ฐํ˜• ํŒ ์œ„์—์„œ ์ด๋ค„์ง€๋Š”๋ฐ, ๊ฒŒ์ž„ ์‹œ์ž‘ ์ „ ์ผ๋ถ€ ์นธ์—๋Š” 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ํ•˜๋‚˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋‹ค.

๋‚˜๋จธ์ง€ ๋นˆ ์นธ์„ ์ฑ„์šฐ๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฐ๊ฐ์˜ ๊ฐ€๋กœ์ค„๊ณผ ์„ธ๋กœ์ค„์—๋Š” 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋‚˜ํƒ€๋‚˜์•ผ ํ•œ๋‹ค.
  2. ๊ตต์€ ์„ ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š” 3x3 ์ •์‚ฌ๊ฐํ˜• ์•ˆ์—๋„ 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋‚˜ํƒ€๋‚˜์•ผ ํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์˜ ๊ฒฝ์šฐ, ์ฒซ์งธ ์ค„์—๋Š” 1์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ 2๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๋“ค์ด ์ด๋ฏธ ๋‚˜ํƒ€๋‚˜ ์žˆ์œผ๋ฏ€๋กœ ์ฒซ์งธ ์ค„ ๋นˆ์นธ์—๋Š” 1์ด ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

๋˜ํ•œ ์œ„์ชฝ ๊ฐ€์šด๋ฐ ์œ„์น˜ํ•œ 3x3 ์ •์‚ฌ๊ฐํ˜•์˜ ๊ฒฝ์šฐ์—๋Š” 3์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ˆซ์ž๋“ค์ด ์ด๋ฏธ ์“ฐ์—ฌ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์šด๋ฐ ๋นˆ ์นธ์—๋Š” 3์ด ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

์ด์™€ ๊ฐ™์ด ๋นˆ ์นธ์„ ์ฐจ๋ก€๋กœ ์ฑ„์›Œ ๊ฐ€๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๊ฒŒ์ž„ ์‹œ์ž‘ ์ „ ์Šค๋„์ฟ  ํŒ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆซ์ž๋“ค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ๋ชจ๋“  ๋นˆ ์นธ์ด ์ฑ„์›Œ์ง„ ์ตœ์ข… ๋ชจ์Šต์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์•„ํ™‰ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— 9๊ฐœ์”ฉ ๊ฒŒ์ž„ ์‹œ์ž‘ ์ „ ์Šค๋„์ฟ ํŒ ๊ฐ ์ค„์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ํ•œ ์นธ์”ฉ ๋„์›Œ์„œ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์Šค๋„์ฟ  ํŒ์˜ ๋นˆ ์นธ์˜ ๊ฒฝ์šฐ์—๋Š” 0์ด ์ฃผ์–ด์ง„๋‹ค. ์Šค๋„์ฟ  ํŒ์„ ๊ทœ์น™๋Œ€๋กœ ์ฑ„์šธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์˜ ์ž…๋ ฅ์€ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

์ถœ๋ ฅ

๋ชจ๋“  ๋นˆ ์นธ์ด ์ฑ„์›Œ์ง„ ์Šค๋„์ฟ  ํŒ์˜ ์ตœ์ข… ๋ชจ์Šต์„ ์•„ํ™‰ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— 9๊ฐœ์”ฉ ํ•œ ์นธ์”ฉ ๋„์›Œ์„œ ์ถœ๋ ฅํ•œ๋‹ค.

์Šค๋„์ฟ  ํŒ์„ ์ฑ„์šฐ๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฟ์ธ ๊ฒฝ์šฐ๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜๋งŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ œํ•œ

baekjoon์˜ ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ์€ ๊ทธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด๋‹ค.

  • C++14: 80ms
  • Java: 292ms
  • PyPy3: 1172ms

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•˜์—ฌ ์Šค๋„์ฟ ๋ฅผ ์™„์„ฑ์‹œํ‚ค๋Š” ๋ฌธ์ œ๋‹ค.

 

์ขŒํ‘œ๋กœ 9x9 ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ˆซ์ž๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€(0) ์นธ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ์ˆซ์ž๋“ค์„ ์ฐพ๋Š”๋‹ค.

๊ฐ€๋Šฅํ•œ ์ˆซ์ž๋“ค์€ ํ•ด๋‹น ์นธ์˜ ํ–‰, ์—ด, ์ •์‚ฌ๊ฐํ˜•(3x3)์— ์œ„์น˜ํ•œ ์ˆซ์ž๋“ค ์ค‘ ๊ณตํ†ต์œผ๋กœ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์€ ๊ฐ’์ด๋‹ค.

set() ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ–‰, ์—ด, ์ •์‚ฌ๊ฐํ˜•(3x3)์— ์œ„์น˜ํ•œ ์ˆซ์ž๋“ค์„ ๋ชจ๋‘ ๋‹ด์€ ํ›„ all(1~9๊นŒ์ง€ ๋‹ด์€ set)๊ณผ์˜ ์ฐจ์ง‘ํ•ฉ์„ ์ด์šฉํ•˜์—ฌ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ›„๋ณด๋ฅผ ๊ตฌํ•˜์˜€๋‹ค.

 

์ดํ›„ ๋ฐ˜๋ณต๋ฌธ ๋ฐ ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ›„๋ณด๋“ค์„ ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด๊ฐ€๋ฉฐ, ์Šค๋„์ฟ  ์™„์„ฑ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ€๋Šฅํ•œ ์Šค๋„์ฟ ๋Š” ๋‹ค์ˆ˜์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ์ค‘ ํ•˜๋‚˜๋งŒ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๋ฏ€๋กœ solve ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์‹œ์ ์ด ๋˜๋ฉด exit()๋ฅผ ์ด์šฉํ•˜์—ฌ ๋” ์ด์ƒ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•˜์˜€๋‹ค.

 

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

def check(r, c):
    global matrix, cols
    exist = set()
    for num in matrix[r]: # ์—ด ํƒ์ƒ‰
        if num: exist.add(num)
    for idx in range(9): # ํ–‰ ํƒ์ƒ‰
        if matrix[idx][c]: exist.add(matrix[idx][c])

    sr, sc = r//3*3, c//3*3
    for i in range(sr, sr+3): # 3x3 ํƒ์ƒ‰
        for j in range(sc, sc+3):
            if matrix[i][j]: exist.add(matrix[i][j])
    return list(all - exist) # ๊ฐ€๋Šฅํ•œ ํ›„๋ณด ์ˆซ์ž๋“ค์„ return

def res():
    for row in matrix:
        print(' '.join(map(str, row)))

def solve(r, c):
    if c == 9: r += 1; c = 0 # ํ•œ ํ–‰์˜ ํƒ์ƒ‰์„ ๋งˆ์น˜๋ฉด ๋‹ค์Œ ํ–‰ ์ฒซ ๋ฒˆ์งธ ์นธ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
    if r > 8 or c > 8: # 9x9 ์Šค๋„์ฟ  ํƒ์ƒ‰ ์ข…๋ฃŒ
        res() # ์Šค๋„์ฟ  ์ถœ๋ ฅ
        exit() # ํƒ์ƒ‰ ์ข…๋ฃŒ
    if not matrix[r][c]: # ์ˆซ์ž๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ์นธ
        candidates = check(r, c) 
        for num in candidates:
            matrix[r][c] = num
            solve(r, c+1)
            matrix[r][c] = 0
    else:
        solve(r, c+1)

matrix = [list(map(int, input().split())) for _ in range(9)]
all = set(i for i in range(1, 10))
solve(0, 0)

Python3๋กœ ์ œ์ถœํ–ˆ์„ ๋•Œ๋Š” '์‹œ๊ฐ„์ดˆ๊ณผ'๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๋ฌธ์ œ์—์„œ๋„ '์ œํ•œ'์— Pypy3์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ์ ์–ด๋†จ๋Š”๋ฐ Python3๋กœ ๊ณ„์† ์‹œ๋„ํ•˜๋ฉด์„œ ๋˜ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ๋‹ค... ๐Ÿ˜‚

๋Œ“๊ธ€