๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด

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

by syLim___ 2023. 3. 7.
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/60059

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


์šฐ์™• ์ง„์งœ ์–ด๋ ต๋‹ค

 

์ผ๋‹จ ์•„์ด๋””์–ด ์ž์ฒด๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฑด ์•„์ฃผ ํฌ๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š๋‹ค

๊ทธ๋ ‡์ง€๋งŒ ์ด๊ฒƒ์กฐ์ฐจ ๋ฌด์ง€์„ฑ์œผ๋กœ ํ•˜๋ฉด ๋น„ํšจ์œจ์ ์ด๊ณ , ๋จธ๋ฆฌ๋ฅผ ์“ฐ๊ธด ์จ์•ผํ•จ

 

๋ฌธ์ œ ์กฐ๊ฑด์ด๋‹ค.

M๊ณผ N์ด ์•„์ฃผ ์ž‘์€ ์ •์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ,ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๋ผ์›Œ๋ด๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์•ผํ•œ๋‹ค.

 

์ด์ œ๋ถ€ํ„ฐ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ์ง€์ด๋‹ค.


์šฐ์„   key๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ผ์›Œ๋ณด๊ธฐ ์ „์—, ๋ณด๋‹ค ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ

lock ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ๋ฅผ 3๋ฐฐ ํ™•์žฅํ•ด์ค€๋‹ค.

 

<lock: ํ™•์žฅ ์ „>

1 1 1
1 1 0
1 0 1

 

<newLock: ํ™•์žฅ ํ›„>

0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 1 1 0 0 0 0
0 0 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

 

์ด ์ƒํƒœ์—์„œ ์—ด์‡ ๋ฅผ ํšŒ์ „ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ฒจ๊ฐ€๋ฉด์„œ ๋ฐฐ์—ด์— ๋ผ์›Œ๋งž์ถฐ๋ณธ๋‹ค.

์—ด์‡ ๋ฅผ ๋ผ์›Œ๋ณธ ๋’ค์—๋Š” lock์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์ƒ‰ ๋ถ€๋ถ„์˜ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ 1์ธ์ง€ ์ฒดํฌํ•˜๋ฉด ๋œ๋‹ค.

 

(๋ชจ๋‘ 1์ด ๋˜๋ฉด true๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—ด์‡ ๋ฅผ ํšŒ์ „ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ฒจ์„œ ๋‹ค์‹œ ๋ผ์›Œ๋ณด๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณต)


์—ด์‡  ํšŒ์ „์‹œํ‚ค๊ธฐ

#๋ฐฐ์—ด 90๋„ ํšŒ์ „์‹œํ‚ค๊ธฐ
def rotate(arr):
    n, m = len(arr), len(arr[0])
    result = [[0]*n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[j][n-i-1] = arr[i][j]
    return result

์ฐธ๊ณ : 2์ฐจ์›๋ฐฐ์—ด ์˜ค๋ฅธ์ชฝ์œผ๋กœ 90๋„ ํšŒ์ „์‹œํ‚ค๊ธฐ


์ „์ฒด ์†Œ์Šค์ฝ”๋“œ

#์—ด์‡  ํšŒ์ „์‹œํ‚ค๊ธฐ
def rotate(arr):
    n, m = len(arr), len(arr[0])
    result = [[0]*n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[j][n-i-1] = arr[i][j]
    return result

#์ž๋ฌผ์‡  ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ชจ๋‘ ์ •ํ™•ํžˆ 1์ธ์ง€ ์ฒดํฌ
def check(newLock):
    length = len(newLock)//3
    for i in range(length,length*2):
        for j in range(length,length*2):
            if newLock[i][j] != 1:
                return False
    return True

def solution(key, lock):
    n = len(lock)
    m = len(key)
    
    #์ž๋ฌผ์‡  ๋ฐฐ์—ด 3๋ฐฐ ํ™•์žฅํ•˜๊ธฐ
    newLock = [[0 for j in range(n*3)] for i in range(n*3)]
    for i in range(n,n*2):
        for j in range(n,n*2):
            newLock[i][j] = lock[i-n][j-n]
            
    #key๋ฅผ 4๋ฒˆ ํšŒ์ „์‹œํ‚ค๋ฉด์„œ ํ™•์ธ
    for rotation in range(4):
        key = rotate(key)
        for x in range(n*2):
            for y in range(n*2):
                #์—ด์‡  ๊ปด๋ณด๊ธฐ
                for i in range(m):
                    for j in range(m):
                        newLock[x+i][y+j] += key[i][j]
                #์—ด๋ฆฌ๋Š”์ง€ ์ฒดํฌ
                if check(newLock) == True:
                    return True
                #์—ด์‡  ๋นผ๊ธฐ
                for i in range(m):
                    for j in range(m):
                        newLock[x+i][y+j] -= key[i][j]
                    
    return False

 

์ถœ์ฒ˜: ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ (๋‚˜๋™๋นˆ)

728x90