๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Code/Coding Test

[์ด์ฝ”ํ…Œ] Implementation _ ์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

by hyelog 2023. 5. 21.

๐Ÿƒ‍โ™€๏ธ๋ฌธ์ œ ๋ถ„์„

  • ์ž๋ฌผ์‡ ์˜ ํ™ˆ๊ณผ ์—ด์‡ ์˜ ๋Œ๊ธฐ๊ฐ€ ๋”ฑ ๋งž์•„์•ผ ํ•จ
    • ๋Œ๊ธฐ, ๋Œ๊ธฐ / ํ™ˆ, ํ™ˆ ์€ ๋งŒ๋‚˜๋ฉด ์•ˆ๋จ
    • ์—ด ์ˆ˜ ์žˆ์œผ๋ฉด True, ์•ˆ๋˜๋ฉด False
  • key M * M (3 <= M <=20)
    • ํšŒ์ „๊ณผ ์ด๋™ ๊ฐ€๋Šฅ
  • lock N * N (3 <= N <=20)
  • M <= N
  • 0: ํ™ˆ, 1:๋Œ๊ธฐ

๐Ÿ›  ์ด์ฝ”ํ…Œ ๋‹ต์•ˆ

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ 90๋„ ํšŒ์ „ํ•˜๊ธฐ
def rotate_a_matrix_by_90_degree(a):
    n = len(a) # ํ–‰ ๊ธธ์ด ๊ณ„์‚ฐ
    m = len(a[0]) # ์—ด ๊ธธ์ด ๊ณ„์‚ฐ
    result = [[0] * n for _ in range(m)] # ํšŒ์ „๋œ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ
    # ๋ชจ๋“  ์š”์†Œ๊ฐ’์„ 90๋„ ํšŒ์ „
    for i in range(n):
        for j in range(m):
            result[j][n - i - 1] = a[i][j]
    return result

# ์ž๋ฌผ์‡ ์˜ ํ™ˆ๋ถ€๋ถ„์ด ๋ชจ๋‘ 1๋กœ ์ฑ„์›Œ์กŒ๋Š”์ง€ ํ™•์ธ
def check(new_lock):
    for i in range(len(new_lock)//3, (len(new_lock)//3)*2):
        for j in range(len(new_lock)//3, (len(new_lock)//3)*2):
            if new_lock[i][j] != 1:
                return False
    return True

def solution(key, lock):
    # ์ž๋ฌผ์‡ ์˜ ํฌ๊ธฐ ์ธก์ •
    n = len(lock)
    # ์—ด์‡ ์˜ ํฌ๊ธฐ ์ธก์ •
    m = len(key)
    # ์ž๋ฌผ์‡ ์˜ ํฌ๊ธฐ ํ™•์žฅ
    new_lock = [[0]*(n*3) for _ in range(n*3)]

    # ์ƒˆ๋กœ์šด ์ž๋ฌผ์‡ ์˜ ์ค‘์•™ ๋ถ€๋ถ„์— ๊ธฐ์กด์˜ ์ž๋ฌผ์‡  ๋„ฃ๊ธฐ
    for i in range(n):
        for j in range(n):
            new_lock[i+n][j+n] = lock[i][j]

    # ์—ด์‡ ๋ฅผ ํšŒ์ „ํ•œ ๋’ค, ํ•ด๋‹น ์—ด์‡ ๋กœ ์ž๋ฌผ์‡ ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ, ์ด๋ฅผ ๋ฐ˜๋ณตํ•จ
    for _ in range(4):
        # ์—ด์‡  ํšŒ์ „
        key = rotate_a_matrix_by_90_degree(key)

        for i in range(n*2):
            for j in range(n*2):
                # ์ž๋ฌผ์‡ ์— ์—ด์‡  ์ฑ„์šฐ๊ธฐ
                for k in range(m):
                    for l in range(m):
                        new_lock[i+k][j+l] += key[k][l]

                # ์ž๋ฌผ์‡ ์˜ ํ™ˆ๋ถ€๋ถ„์ด ๋ชจ๋‘ 1๋กœ ์ฑ„์›Œ์กŒ๋Š”์ง€ ํ™•์ธ
                if (check(new_lock) == True):
                    return True

                # ์ž๋ฌผ์‡ ์—์„œ ์—ด์‡  ๋‹ค์‹œ ๋นผ๊ธฐ
                for k in range(m):
                    for l in range(m):
                        new_lock[i+k][j+l] -= key[k][l]

    return False

๐Ÿ” ์ •๋‹ต ๋ถ„์„

๐Ÿ“Œ ๊ธฐ์–ตํ• ๊ฒƒ!

  • ํŒŒ์ด์ฌ์€ 1์ดˆ์— 2000๋งŒ์—์„œ 1์–ต ์ •๋„์˜ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ! -> ์ด ์ดํ•˜์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์™„์ „ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ํ‚ค๊ฐ€ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋„ ๋˜๋ฏ€๋กœ ์ž๋ฌผ์‡  ๋ณด๋“œ๋ฅผ ํ‚ค์›Œ์„œ ์ƒ๊ฐ -> ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋„ ์‰ฝ๊ฒŒ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ์Œ!
  • 2์ฐจ์› ํ•จ์ˆ˜ 90๋„ ํšŒ์ „ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ž์ฃผ ์“ฐ์ž„ ์ฝ”๋“œ ๊ธฐ์–ตํ•ด ๋‘๊ธฐ!

๋Œ“๊ธ€