PS
[Programmers] ์๋ฌผ์ ์ ์ด์ with Python
ํ์ค_It's
2021. 11. 29. 20:54
728x90
๋ฐ์ํ
๐ Programmers - [์๋ฌผ์ ์ ์ด์ ]
๐ก ์กฐ๊ฑด
key
๋M x M(3 โค M โค 20, M์ ์์ฐ์)
ํฌ๊ธฐ 2์ฐจ์ ๋ฐฐ์ดlock
์N x N(3 โค N โค 20, N์ ์์ฐ์)
ํฌ๊ธฐ 2์ฐจ์ ๋ฐฐ์ดM์ ํญ์ N ์ดํ
,key
์lock
์ ์์๋0 ๋๋ 1
- ์๋ฌผ์ ๋ ํ์ด ์์ผ๋ฉฐ, ์ด์ ๋ ๋๊ธฐ๊ฐ ์๋ค. ์ด์ ๋ ํ์ ์ด ๊ฐ๋ฅํ๋ค.
- ์๋ฌผ์ ๋ถ๋ถ์ด ํ์ ํ ์ ์๋ ์ด์ ์ ๊ฒน์ณ์ ธ์ ๋ชจ๋ 1์ด ๋๋ค๋ฉด ์ด ์ ์์ผ๋
True
, ์ด ์ ์๋ค๋ฉดFalse
๋ฅผ ๋ฐํ - ๊ตฌํ & ์๋ฎฌ๋ ์ด์ ์ ํ์ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
def turn_key(l, key):
new_key = [item[:] for item in key]
for i in range(l):
for j in range(l):
new_key[i][j] = key[l - (j + 1)][i]
return new_key
def check(lock, lock_l):
for i in range(lock_l):
for j in range(lock_l):
if lock[i + lock_l][j + lock_l] != 1:
return False
return True
def solution(key, lock):
key_l = len(key)
lock_l = len(lock)
new_lock = [[0] * (lock_l * 3) for _ in range(lock_l * 3)]
new_len = len(new_lock)
for i in range(lock_l):
for j in range(lock_l):
new_lock[i + lock_l][j + lock_l] = lock[i][j]
for i in range(4):
key = turn_key(key_l, key)
for i in range(new_len - key_l):
for j in range(new_len - key_l):
for k in range(key_l):
for p in range(key_l):
new_lock[i + k][j + p] += key[k][p]
if check(new_lock, lock_l):
return True
else:
for k in range(key_l):
for p in range(key_l):
new_lock[i + k][j + p] -= key[k][p]
return False
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
print(solution([[0, 0, 0], [1, 0, 0], [0, 1, 1]], [[0, 0, 0, 0], [1, 1, 1, 0], [0, 0, 0, 0], [1, 0, 1, 0]]))
์คํ๊ฒฐ๊ณผ
true
โจ๏ธ ๋ฌธ์ ํ์ด
N
๊ณผM
์ ์ต๋ ํฌ๊ธฐ๊ฐ20
์ด๋, ์ด์ ์ ์ต์ํฌ๊ธฐ์ธ 3๋งํผ ์๋ฌผ์ ์ ๊ธธ์ด์ ๊ณฑํด์ ๋งต์ ๋ปฅํ๊ธฐ ์ํจ๋ค.
์ด ์์ ์ ์ด์ ๋ฅผ ์์ง์ด๊ธฐ ํธํ๊ธฐ ์ํด์ ์ ์ฒด ๋งต์ ํฌ๊ธฐ๋ฅผ ํค์ฐ๋ ๊ฒ.๋งต์ ํฌ๊ธฐ๋ฅผ ์ธ๋ฐฐ๋ก ๋ํ๋ค๋ฉด, ์๋ ์๋ฌผ์ ๋ฅผ ๊ฐ์ด๋ฐ ์์น์ ์์น์ํจ๋ค.
for i in range(lock_l):
for j in range(lock_l):
new_lock[i + lock_l][j + lock_l] = lock[i][j]
- ์ด์ ๋ ์ด 4๋ฐฉํฅ์ผ๋ก ๋ ์ ์์ผ๋, ์ด์ ๋ฅผ ๋ฏธ๋ฆฌ ํ ๋ฒ ๋๋ฆฌ๊ณ ์ด๋์ํค๋ฉด์ ์๋ฌผ์ ๊ฐ ์ด๋ฆฌ๋์ง ์ฒดํฌํ๋ฉด ๋๋ค.
key = turn_key(key_l, key)
def turn_key(l, key):
new_key = [item[:] for item in key]
for i in range(l):
for j in range(l):
new_key[i][j] = key[l - (j + 1)][i]
return new_key
- ์ด์ ๋ฅผ 0, 0 ๋ถํฐ new_lock ์ ํฌ๊ธฐ์์ key์ ๊ธธ์ด๋งํผ ๋บ ๊ฐ๊น์ง ์ด๋์ํค๋ฉด์ ๋ฐ๋ณต์ํ๋ฅผ ํ๋ค.
def check(lock, lock_l): for i in range(lock_l): for j in range(lock_l): if lock[i + lock_l][j + lock_l] != 1: return False return True
๐พ ๋๋์
- ์ด์ ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์์ ํค๋งฌ๋ปํ์ง๋ง, ๋ฐ๋ณต ์๋ฌ๋์ ์ ํ ์ ์์๋ค.
- ์๋ฌผ์ ์ ์ ์ฒด ํฌ๊ธฐ๋ฅผ ํค์์ ํ๋ ๋ฐฉ๋ฒ์ N, M ์ ํฌ๊ธฐ๊ฐ ์์ ๊ฒ์ ํ์ธํ๊ณ ์๊ฐํด๋ผ ์ ์์๋ค.
- ์ญ์ ์๋ฎฌ๋ ์ด์ & ๊ตฌํ ๋ฌธ์ ๋ ์ด๋ ต๋ค.
๋ฐ์ํ