๐ค๋ฌธ์ ํด๊ฒฐ
1. lv3 | ์์ ํ์?
2. ์๋ฌผ์ ์ฃผ์๋ฅผ 1๊ณผ0์ด ์๋ ๋ค๋ฅธ ์ซ์๋ก ์ฑ์์ค๋ค. ( ์ด์ ์ ๊ธธ์ด - 1 ๋งํผ )
3. ์ด์ ๋ฅผ ์๋กญ๊ฒ ๋ง๋ค์ด์ง ์๋ฌผ์ ์์ ๋๊ณ 2์ค for๋ฌธ์ผ๋ก ์ ๋ถ ๊ฒน์ณ๊ฐ๋ฉฐ ํ์ํ๋ค.
( ์๋ฌผ์ ๋ฅผ ์ด์ ์ ํฌ๊ธฐ๋งํผ ์๋ผ์ ์ด์ ์ ์๋ฌผ์ ๋ฅผ ๋น๊ต)
( ๋ ธ๋์: ์๋์๋ฌผ์ , ์ด๋ก์: ์๋กญ๊ฒ ์ฑ์๋์ ๋น๊ณต๊ฐ, ํ๋์: ์ด์
4. ์ด์์ ๋๊ธฐ(1)์ ์๋ฌผ์ ์ ๊ตฌ๋ฉ(0)์ด ๋ง๋๋ฉด ์นด์ดํธ +1,
์ด์ ์ ๋๊ธฐ(1)์ ์๋ฌผ์ ์ ๋๊ธฐ(1)๊ฐ ๋ง๋๋ฉด ํ๋ฝ,
์ด์ ์ ๊ตฌ๋ฉ(0)๊ณผ ์๋ฌผ์ ์ ๊ตฌ๋ฉ(0)์ด ๋ง๋๋ฉด ํ๋ฝ,
์๋ฌผ์ ์ ๋ชจ๋ ๊ตฌ๋ฉ(0)์ด ์ด์ ์ ๋๊ธฐ(1)๋ก ์ฑ์์ ธ์ผ ํ๋ค. (์ฆ, ํ๋์์ญ ์์ ์๋ฌผ์ ๊ฐ ๋ชจ๋ ๊ตฌ๋ฉ(0)์ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค)
5. ์๋ฌผ์ ์ ์ฒด์ ๊ตฌ๋ฉ์ ์ซ์์ ์ด์ ์ ๋๊ธฐ๊ฐ ์๋ฌผ์ ์ ๊ตฌ๋ฉ์ ๋ง๋ ์๋ฅผ ๋น๊ตํด์ ์ผ์นํ๋ฉด ์ฑ๊ณต, ์๋๋ฉด ๋ค์์ผ๋ก
6. ๋๊น์ง ํ์ ํ๋ค๋ฉด ์ด์ ๋ฅผ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์์ผ์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ 3๋ฒ๋ถํฐ ๋ฐ๋ณตํ๋ค.
๐จ ์ฒ์ ์ฃผ๋ณ์ ์ฑ์ฐ์ง์๊ณ ์ด๋ป๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ ์กฐ์ ํด์ ํด๋ณด๋ ค๊ณ ํ์ง๋ง ๊ท์น์ ์ฐพ๊ธฐ๊ฐ ๋๋ฌด ํ๋ค์๋ค. ์ฃผ๋ณ์ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ๋ณด๋ ์์ ์ ํ์๋ ์ฌ์ด ๋ฌธ์ ์ ๋น์ทํ๋ค. ์ด ๋ฌธ์ ์์๋ ์ฃผ๋ณ์ ์ฑ์ฐ๋ ์์ด๋์ด๋ฅผ ์๊ฐํ๋๊ฒ ํต์ฌ
๐ป์์ค ์ฝ๋
from itertools import chain # 2์ฐจ์๋ฆฌ์คํธ 1์ฐจ์๋ฆฌ์คํธ๋ก ๋ง๋ค๊ธฐ
def solution(key, lock):
lenK = len(key)
lenL = len(lock)
# ์๋ฌผ์ ์ฃผ์๋ฅผ ๋น๊ณต๊ฐ์ผ๋ก ํ์ฅํด์ฃผ๊ธฐ | ์ธ๋ฑ์ค์๋ฌ๋ฐฉ์ง - ์ด ๋ฌธ์ ์ ํต์ฌ
lock = fillAround(lock, key)
for i in range(4): # ์ต์ดํ๋ฒ, 90, 180, 270 ํ์ธ
if cutLock(key, lock): # ์ผ์นํ๋ฉด True๋ฐํํ๊ณ ๋
return True
else: # ์๋๋ฉด key๋ฅผ ํ์ ์ํจ๋ค.
key = lotationKey(key)
return False
# ์๋ฌผ์ ์๋ฅด๊ธฐ
def cutLock(key, lock):
# ์๋ฌผ์ ์ ์ด์ ๊ตฌ๋ฉ ๊ฐฏ์
holeCnt = list((chain.from_iterable(lock))).count(0)
lenK = len(key)
lenL = len(lock) - (lenK * 2 - 2)
for i in range(lenK + lenL - 1):
for j in range(lenK + lenL - 1):
# ์๋ฌผ์ ๋ฅผ ์ด์ ํฌ๊ธฐ๋งํผ ์๋ฅด๊ธฐ
partOfLock = [row[j:j + lenK] for row in lock[i:i + lenK]]
# tip: ์๋ฅธ ์๋ฌผ์ ์ ๊ตฌ๋ฉ์ด ์ ์ฒด ๊ตฌ๋ฉ์ ํฌํจํ ๋๋ง ์ฒดํฌํ๋ฉด ๋๋ค!
if list(chain.from_iterable(partOfLock)).count(0) == holeCnt:
if checkKey(key, partOfLock, holeCnt):
return True
return False
# ์ด์ ๊ฐ ๋ง๋ ์ง ํ์ธ
def checkKey(key, partOfLock, holeCnt):
lenK = len(key)
cnt = 0
for i in range(lenK):
for j in range(lenK):
if key[i][j] == 1: # ์ด์ ๋๊ธฐ์
if partOfLock[i][j] == 0: # ์๋ฌผ์ ๊ตฌ๋ฉ์ด ๋ง๋๋ฉด O
cnt += 1
elif partOfLock[i][j] == 1: # ์๋ฌผ์ ๋๊ธฐ๊ฐ ๋ง๋๋ฉด X
return False
else: # ์ด์ ๊ตฌ๋ฉ๊ณผ
if partOfLock[i][j] == 0: # ์ด์ ๊ตฌ๋ฉ์ด ๋ง๋๋ฉด X
return False
if cnt == holeCnt:
return True
return False
# ์๋ฌผ์ ์ ์ฃผ์๋ฅผ ์ฑ์์ฃผ๊ธฐ ํ์ธ!!
def fillAround(lock, key):
lenL = len(lock)
lenK = len(key)
# ์์๋ ์ฑ์ฐ๊ธฐ
newLock = [[9] * lenL] * (lenK - 1) + lock + [[9] * lenL] * (lenK - 1)
# ์์ ์ฑ์ฐ๊ธฐ
for i in range(len(newLock)):
newLock[i] = [9] * (lenK - 1) + newLock[i] + [9] * (lenK - 1)
return newLock
# ์ด์ ํ์ ํ๊ธฐ ํ์ธ!
def lotationKey(key):
lenK = len(key)
newKey = [[0] * lenK for _ in range(lenK)]
for i in range(lenK):
for j in range(lenK):
newKey[i][j] = key[lenK - j - 1][i]
return newKey
print(solution([[0, 0, 0], [1, 0, 0], [0, 1, 1]], [[1, 1, 1], [1, 1, 0], [1, 0, 1]]))
๐๋ฌธ์ ํ์ธ
์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค
๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/60059+
๋ฌธ์ ์ค๋ช
๊ณ ๊ณ ํ์์ธ ํ๋ธ๋ ๊ณ ๋ ์ ์ ์ง์์ ๋ณด๋ฌผ๊ณผ ์ ์ ์ด ๊ฐ๋ํ ๊ฒ์ผ๋ก ์ถ์ ๋๋ ๋น๋ฐ์ ๋ฌธ์ ๋ฐ๊ฒฌํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ์ด๋ ค๊ณ ์ดํด๋ณด๋ ํน์ดํ ํํ์ ์๋ฌผ์ ๋ก ์ ๊ฒจ ์์๊ณ ๋ฌธ ์์๋ ํน์ดํ ํํ์ ์ด์ ์ ํจ๊ป ์๋ฌผ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํด ์ฃผ๋ ์ข ์ด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์ ๊ฒจ์๋ ์๋ฌผ์ ๋ ๊ฒฉ์ ํ ์นธ์ ํฌ๊ธฐ๊ฐ 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์ ๋๊ธฐ ๋ถ๋ถ์ ๋ํ๋ ๋๋ค.
์ ์ถ๋ ฅ ์
keylockresult
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] | [[1, 1, 1], [1, 1, 0], [1, 0, 1]] | true |
์ ์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
key๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ๊ณ , ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ, ์๋๋ก ํ ์นธ ์ด๋ํ๋ฉด lock์ ํ ๋ถ๋ถ์ ์ ํํ ๋ชจ๋ ์ฑ์ธ ์ ์์ต๋๋ค.
'Algorithm Problem > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python] ํ๋ก๊ทธ๋๋จธ์ค - ๊ฐ์ฌ ๊ฒ์(2020 KAKAO BLIND RECRUITMENT) (0) | 2020.08.31 |
---|---|
[python] ํ๋ก๊ทธ๋๋จธ์ค - ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (2020 ์นด์นด์ค ์ธํด์ญ) (0) | 2020.08.30 |
[python] ๋ฐฑ์ค - 1309. ๋๋ฌผ์ (0) | 2020.08.28 |
[python] ๋ฐฑ์ค - 1992. ์ฟผ๋ํธ๋ฆฌ (0) | 2020.08.27 |
[python] ๋ฐฑ์ค - 7569. ํ ๋งํ (0) | 2020.08.26 |