Algorithm/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / PythonํŒŒ์ด์ฌ] ์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

meeeeejin 2021. 7. 24. 00:58

๋ฌธ์ œ ๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/60059

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr

 

 

๋ฌธ์ œ ์„ค๋ช…

๊ณ ๊ณ ํ•™์ž์ธ "ํŠœ๋ธŒ"๋Š” ๊ณ ๋Œ€ ์œ ์ ์ง€์—์„œ ๋ณด๋ฌผ๊ณผ ์œ ์ ์ด ๊ฐ€๋“ํ•  ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜๋Š” ๋น„๋ฐ€์˜ ๋ฌธ์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์„ ์—ด๋ ค๊ณ  ์‚ดํŽด๋ณด๋‹ˆ ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์ž๋ฌผ์‡ ๋กœ ์ž ๊ฒจ ์žˆ์—ˆ๊ณ  ๋ฌธ ์•ž์—๋Š” ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์—ด์‡ ์™€ ํ•จ๊ป˜ ์ž๋ฌผ์‡ ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ด ์ฃผ๋Š” ์ข…์ด๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ž ๊ฒจ์žˆ๋Š” ์ž๋ฌผ์‡ ๋Š” ๊ฒฉ์ž ํ•œ ์นธ์˜ ํฌ๊ธฐ๊ฐ€ 1 x 1์ธ N x N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐ ๊ฒฉ์ž ํ˜•ํƒœ์ด๊ณ  ํŠน์ดํ•œ ๋ชจ์–‘์˜ ์—ด์‡ ๋Š” M x M ํฌ๊ธฐ์ธ ์ •์‚ฌ๊ฐ ๊ฒฉ์ž ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ž๋ฌผ์‡ ์—๋Š” ํ™ˆ์ด ํŒŒ์—ฌ ์žˆ๊ณ  ์—ด์‡  ๋˜ํ•œ ํ™ˆ๊ณผ ๋Œ๊ธฐ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด์‡ ๋Š” ํšŒ์ „๊ณผ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์—ด์‡ ์˜ ๋Œ๊ธฐ ๋ถ€๋ถ„์„ ์ž๋ฌผ์‡ ์˜ ํ™ˆ ๋ถ€๋ถ„์— ๋”ฑ ๋งž๊ฒŒ ์ฑ„์šฐ๋ฉด ์ž๋ฌผ์‡ ๊ฐ€ ์—ด๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ž๋ฌผ์‡  ์˜์—ญ์„ ๋ฒ—์–ด๋‚œ ๋ถ€๋ถ„์— ์žˆ๋Š” ์—ด์‡ ์˜ ํ™ˆ๊ณผ ๋Œ๊ธฐ๋Š” ์ž๋ฌผ์‡ ๋ฅผ ์—ฌ๋Š” ๋ฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ง€๋งŒ, ์ž๋ฌผ์‡  ์˜์—ญ ๋‚ด์—์„œ๋Š” ์—ด์‡ ์˜ ๋Œ๊ธฐ ๋ถ€๋ถ„๊ณผ ์ž๋ฌผ์‡ ์˜ ํ™ˆ ๋ถ€๋ถ„์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ์—ด์‡ ์˜ ๋Œ๊ธฐ์™€ ์ž๋ฌผ์‡ ์˜ ๋Œ๊ธฐ๊ฐ€ ๋งŒ๋‚˜์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž๋ฌผ์‡ ์˜ ๋ชจ๋“  ํ™ˆ์„ ์ฑ„์›Œ ๋น„์–ด์žˆ๋Š” ๊ณณ์ด ์—†์–ด์•ผ ์ž๋ฌผ์‡ ๋ฅผ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ด์‡ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด key์™€ ์ž๋ฌผ์‡ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด lock์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์—ด์‡ ๋กœ ์ž๋ฌผ์‡ ๋ฅผ ์—ด ์ˆ˜ ์žˆ์œผ๋ฉด true๋ฅผ, ์—ด ์ˆ˜ ์—†์œผ๋ฉด false๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ

  • key๋Š” M x M(3 ≤ M ≤ 20, M์€ ์ž์—ฐ์ˆ˜)ํฌ๊ธฐ 2์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
  • lock์€ N x N(3 ≤ N ≤ 20, N์€ ์ž์—ฐ์ˆ˜)ํฌ๊ธฐ 2์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
  • M์€ ํ•ญ์ƒ N ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • key์™€ lock์˜ ์›์†Œ๋Š” 0 ๋˜๋Š” 1๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • 0์€ ํ™ˆ ๋ถ€๋ถ„, 1์€ ๋Œ๊ธฐ ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

key lock result
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

 

 

 

๋ฌธ์ œ ํ’€์ด

๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋ฐ”๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. key์™€ lock์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ 20์ด๋ฏ€๋กœ ๊ฐ ์›์†Œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ๋‹ค ํ•ด๋„ 20 x 20 = 400๋ฒˆ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์ฒ˜์Œ์— ์—ด์‡ ๋ฅผ (0, 0)๋ถ€ํ„ฐ (N, N)๊นŒ์ง€๋งŒ ์ด๋™์‹œํ‚ค๋ฉด ๋œ๋‹ค๊ณ  ์ž˜๋ชป ์ƒ๊ฐํ•ด์„œ ๊ผฌ์˜€์—ˆ๋‹ค. ์—ด์‡ ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„ (M, M)์œผ๋กœ ์ž๋ฌผ์‡ ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„ (0, 0)์„ ์—ฌ๋Š” ๊ฒฝ์šฐ๊นŒ์ง€ ์ƒ๊ฐ์„ ๋ชปํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. ์ŠคํŠœํ•~~

์ด๋ฅผ ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฌผ์‡ ๋ฅผ ์›๋ž˜ ํฌ๊ธฐ์˜ 3๋ฐฐ๋ฅผ ํ•˜๊ณ  ์›๋ณธ์„ ๊ฐ€์šด๋ฐ์— ๋‘์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›๋ž˜์˜ lock ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3 x 3 ๋ฐฐ์—ด์ด๋ผ๊ณ  ํ•˜๋ฉด

์•„๋ž˜์™€ ๊ฐ™์ด 9 x 9 ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. 

 

์ž๋ฌผ์‡ ๋ฅผ ์—ฌ๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

  1. lock์ด 0์ด๋ฉด key๊ฐ€ 1์ด์–ด์•ผ ํ•œ๋‹ค. 
  2. lock์ด 1์ด๋ฉด key๊ฐ€ 0์ด์–ด์•ผ ํ•œ๋‹ค. 

๋”ฐ๋ผ์„œ lock๊ณผ key๋ฅผ ๋”ํ–ˆ์„ ๋•Œ lock์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ 1์ด๋ฉด ์ž๋ฌผ์‡ ๋ฅผ ์—ด ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์กฐ๊ฑด์— ๋งž๊ฒŒ key๋ฅผ ์ด๋™ ๋ฐ ํšŒ์ „ํ•ด๊ฐ€๋ฉฐ ์ž๋ฌผ์‡ ๋ฅผ ์—ด ์ˆ˜ ์žˆ๋Š”์ง€ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค. 

 

์™„์ „ ํƒ์ƒ‰์„ ์ž˜ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ž๊พธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค 4๊ฐœ ์ •๋„๋ฅผ ํ‹€๋ ค์„œ ํ—ค๋งธ๋‹ค. ์•Œ๊ณ  ๋ณด๋‹ˆ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ ํšŒ์ „์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ result[n - r - 1][n - c - 1]์„ result[n - c - 1][n - r - 1]๋กœ ์ž˜๋ชป ์“ฐ๋Š” ์‹ค์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.๐Ÿ˜ญ ๊ตฌํ˜„ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ด๋Ÿฐ ์‚ฌ์†Œํ•œ ์‹ค์ˆ˜๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์—ˆ๋‹ค. ์•ž์œผ๋กœ ์ฝ”๋“œ ์งค ๋•Œ ๋” ๊ผผ๊ผผํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ค์ˆ˜๋ฅผ ์ค„์—ฌ์•ผ๊ฒ ๋‹ค..!

 

 

 

์†Œ์Šค์ฝ”๋“œ

# ์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

# NxN 2์ฐจ์› ๋ฆฌ์ŠคํŠธ d๋„ ํšŒ์ „
# ํšŒ์ „ ๊ฐ๋„ d => 1: 90๋„, 2: 180๋„, 3: 270๋„
def rotate(array, d):
    n = len(array)  # ๋ฐฐ์—ด์˜ ๊ธธ์ด
    result = [[0] * n for _ in range(n)]

    if d % 4 == 1:
        for r in range(n):
            for c in range(n):
                result[c][n - r - 1] = array[r][c]
    elif d % 4 == 2:
        for r in range(n):
            for c in range(n):
                result[n - r - 1][n - c - 1] = array[r][c]
    elif d % 4 == 3:
        for r in range(n):
            for c in range(n):
                result[n - c - 1][r] = array[r][c]
    else:
        for r in range(n):
            for c in range(n):
                result[r][c] = array[r][c]

    return result


# ์ž๋ฌผ์‡  ์ค‘๊ฐ„ NxN ๋ถ€๋ถ„์ด ๋ชจ๋‘ 1์ธ์ง€ ํ™•์ธ
def check(new_lock):
    n = len(new_lock) // 3
    for i in range(n, n * 2):
        for j in range(n, n * 2):
            if new_lock[i][j] != 1:
                return False
    return True


def solution(key, lock):
    m = len(key)
    n = len(lock)
    # ๊ธฐ์กด ์ž๋ฌผ์‡ ๋ณด๋‹ค 3๋ฐฐ ํฐ ์ž๋ฌผ์‡ 
    new_lock = [[0] * (n * 3) for _ in range(n * 3)]
    # ์ƒˆ๋กœ์šด ์ž๋ฌผ์‡ ์˜ ์ค‘์•™ ๋ถ€๋ถ„์— ๊ธฐ์กด ์ž๋ฌผ์‡  ๋„ฃ๊ธฐ
    for i in range(n):
        for j in range(n):
            new_lock[n + i][n + j] = lock[i][j]

    # ์—ด์‡ ๋ฅผ (1, 1)๋ถ€ํ„ฐ (N*2, N*2)๊นŒ์ง€ ์ด๋™์‹œํ‚ค๋ฉฐ ํ™•์ธ
    for i in range(1, n * 2):
        for j in range(1, n * 2):
            # ์—ด์‡ ๋ฅผ 0, 90, 180, 270๋„๋กœ ํšŒ์ „์‹œํ‚ค๋ฉฐ ํ™•์ธ
            for d in range(4):
                r_key = rotate(key, d)  # key๋ฅผ d๋งŒํผ ํšŒ์ „์‹œํ‚จ ๋ฆฌ์ŠคํŠธ
                for x in range(m):
                    for y in range(m):
                        new_lock[i + x][j + y] += r_key[x][y]

                if check(new_lock):
                    return True

                for x in range(m):
                    for y in range(m):
                        new_lock[i + x][j + y] -= r_key[x][y]

    return False

 

 

 

 

728x90