Algorithm Problem/Python

[python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ž๋ฌผ์‡ ์™€ ์—ด์‡ (2020 KAKAO BLIND RECRUITMENT)

deo2kim 2020. 8. 29. 08:24
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

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+

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ž๋ฌผ์‡ ์™€ ์—ด์‡ 

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr




๋ฌธ์ œ ์„ค๋ช…

๊ณ ๊ณ ํ•™์ž์ธ ํŠœ๋ธŒ๋Š” ๊ณ ๋Œ€ ์œ ์ ์ง€์—์„œ ๋ณด๋ฌผ๊ณผ ์œ ์ ์ด ๊ฐ€๋“ํ•  ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜๋Š” ๋น„๋ฐ€์˜ ๋ฌธ์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์„ ์—ด๋ ค๊ณ  ์‚ดํŽด๋ณด๋‹ˆ ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์ž๋ฌผ์‡ ๋กœ ์ž ๊ฒจ ์žˆ์—ˆ๊ณ  ๋ฌธ ์•ž์—๋Š” ํŠน์ดํ•œ ํ˜•ํƒœ์˜ ์—ด์‡ ์™€ ํ•จ๊ป˜ ์ž๋ฌผ์‡ ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ด ์ฃผ๋Š” ์ข…์ด๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž ๊ฒจ์žˆ๋Š” ์ž๋ฌผ์‡ ๋Š” ๊ฒฉ์ž ํ•œ ์นธ์˜ ํฌ๊ธฐ๊ฐ€ 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์˜ ํ™ˆ ๋ถ€๋ถ„์„ ์ •ํ™•ํžˆ ๋ชจ๋‘ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•