๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ

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

by ๋ญ…์ฆค 2022. 2. 14.
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

ํ’€์ด

 

์—ด์‡ ๋ฅผ ์ ๋‹นํžˆ ํšŒ์ „/์ด๋™์‹œ์ผœ์„œ ์ž๋ฌผ์‡  ํ™ˆ์— ๋”ฑ ๋งž๊ฒŒ ๋ผ์›Œ์•ผ ํ•œ๋‹ค. ์—ด์‡ ์™€ ์ž๋ฌผ์‡  ์‚ฌ์ด์ฆˆ๊ฐ€ ํฌ์ง€ ์•Š์œผ๋ฏ€๋กœ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์ˆ˜์›”ํ•œ ํ’€์ด๋ฅผ ์œ„ํ•ด ์ž๋ฌผ์‡  ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ฅผ 3๋ฐฐ ์ด์ƒ์œผ๋กœ ๋ณ€๊ฒฝ(์ž๋ฌผ์‡ ๋ฅผ ์ค‘๊ฐ„์— ๋‘๊ณ  ๋‚˜๋จธ์ง€๋Š” zero padding)ํ•˜๊ณ  ์—ด์‡ ๋ฅผ ์Šฌ๋ผ์ด๋”ฉ/ํšŒ์ „ ์‹œํ‚ค๋ฉด์„œ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

 

2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ 90๋„ ํšŒ์ „์‹œํ‚ค๋Š” ํ•จ์ˆ˜์™€ ์ž๋ฌผ์‡  ๋ฆฌ์ŠคํŠธ์˜ ์ค‘๊ฐ„ ๋ถ€๋ถ„์ด ๋ชจ๋‘ 1์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

๋ฉ”์ธ์ธ solution ํ•จ์ˆ˜์—์„œ๋Š” ์ž๋ฌผ์‡ ์˜ ํฌ๊ธฐ๋ฅผ 3๋ฐฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ž๋ฌผ์‡  ๋ฆฌ์ŠคํŠธ ์ค‘๊ฐ„์— ๊ธฐ์กด์˜ ์ž๋ฌผ์‡ ๋ฅผ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  4๊ฐ€์ง€ ๋ฐฉํ–ฅ๊ณผ ์—ด์‡ ๊ฐ€ ์ด๋™ํ•˜๋Š” ํ•˜๋Š” ๊ฒƒ์„ for๋ฌธ์„ ๋ˆ๋‹ค. ์—ด์‡ ๋Š” ๊ฐ ์œ„์น˜์—์„œ ์ž๋ฌผ์‡ ์— ๋„ฃ๊ณ  ์—ด์‡ ๊ฐ€ ์ž๋ฌผ์‡ ์— ์ •ํ™•ํžˆ ๋“ค์–ด๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ์ž๋ฌผ์‡ ์—์„œ ์—ด์‡ ๋ฅผ ๋นผ์ฃผ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. 

def rotate_a_matrix_by_90_degree(a):
    n = len(a) # ํ–‰ ๊ธธ์ด
    m = len(a[0]) # ์—ด ๊ธธ์ด
    result = [[0]* n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[j][n-i-1] = a[i][j]
    return result

def check(new_lock):
    lock_length = len(new_lock) // 3
    for i in range(lock_length, lock_length*2):
        for j in range(lock_length, lock_length*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[n+i][n+j] = lock[i][j]
    #print(new_lock[3][3:6],new_lock[4][3:6],new_lock[5][3:6],sep='\n')
    for rotation in range(4):
        key = rotate_a_matrix_by_90_degree(key)
        for x in range(n*2):
            for y in range(n*2):
                for i in range(m):
                    for j in range(m):
                        new_lock[x+i][y+j] += key[i][j]
                if check(new_lock) == True:
                    return True
                for i in range(m):
                    for j in range(m):
                        new_lock[x+i][y+j] -= key[i][j]
    return False

print(solution([[0, 0, 0], [1, 0, 0], [0, 1, 1]],[[1, 1, 1], [1, 1, 0], [1, 0, 1]]))
๋ฐ˜์‘ํ˜•