PS

[Programmers] ์ž๋ฌผ์‡ ์™€ ์—ด์‡  with Python

ํ˜•์ค€_It's 2021. 11. 29. 20:54
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ Programmers - [์ž๋ฌผ์‡ ์™€ ์—ด์‡ ]

๐Ÿ’ก ์กฐ๊ฑด

  1. key๋Š” M x M(3 โ‰ค M โ‰ค 20, M์€ ์ž์—ฐ์ˆ˜) ํฌ๊ธฐ 2์ฐจ์› ๋ฐฐ์—ด
    lock์€ N x N(3 โ‰ค N โ‰ค 20, N์€ ์ž์—ฐ์ˆ˜) ํฌ๊ธฐ 2์ฐจ์› ๋ฐฐ์—ด
    M์€ ํ•ญ์ƒ N ์ดํ•˜, key์™€ lock์˜ ์›์†Œ๋Š” 0 ๋˜๋Š” 1
  2. ์ž๋ฌผ์‡ ๋Š” ํ™ˆ์ด ์žˆ์œผ๋ฉฐ, ์—ด์‡ ๋„ ๋Œ๊ธฐ๊ฐ€ ์žˆ๋‹ค. ์—ด์‡ ๋Š” ํšŒ์ „์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. ์ž๋ฌผ์‡  ๋ถ€๋ถ„์ด ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋Š” ์—ด์‡ ์™€ ๊ฒน์ณ์ ธ์„œ ๋ชจ๋‘ 1์ด ๋œ๋‹ค๋ฉด ์—ด ์ˆ˜ ์žˆ์œผ๋‹ˆ True, ์—ด ์ˆ˜ ์—†๋‹ค๋ฉด False๋ฅผ ๋ฐ˜ํ™˜
  4. ๊ตฌํ˜„ & ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์œ ํ˜•์˜ ๋ฌธ์ œ

๐Ÿ–ฅ ์†Œ์Šค ์ฝ”๋“œ

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

โŒจ๏ธ ๋ฌธ์ œ ํ’€์ด

  1. N๊ณผ M์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ 20์ด๋‹ˆ, ์—ด์‡ ์˜ ์ตœ์†Œํฌ๊ธฐ์ธ 3๋งŒํผ ์ž๋ฌผ์‡ ์˜ ๊ธธ์ด์— ๊ณฑํ•ด์„œ ๋งต์„ ๋ปฅํŠ€๊ธฐ ์‹œํ‚จ๋‹ค.
    ์ด ์ž‘์—…์€ ์—ด์‡ ๋ฅผ ์›€์ง์ด๊ธฐ ํŽธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ „์ฒด ๋งต์˜ ํฌ๊ธฐ๋ฅผ ํ‚ค์šฐ๋Š” ๊ฒƒ.

  2. ๋งต์˜ ํฌ๊ธฐ๋ฅผ ์„ธ๋ฐฐ๋กœ ๋„“ํ˜”๋‹ค๋ฉด, ์›๋ž˜ ์ž๋ฌผ์‡ ๋ฅผ ๊ฐ€์šด๋ฐ ์œ„์น˜์— ์œ„์น˜์‹œํ‚จ๋‹ค.

for i in range(lock_l):
    for j in range(lock_l):
        new_lock[i + lock_l][j + lock_l] = lock[i][j]
  1. ์—ด์‡ ๋Š” ์ด 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
  1. ์—ด์‡ ๋ฅผ 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

๐Ÿ’พ ๋А๋‚€์ 

  1. ์—ด์‡ ๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์—์„œ ํ—ค๋งฌ๋ป”ํ–ˆ์ง€๋งŒ, ๋ฐ˜๋ณต ์ˆ™๋‹ฌ๋•์— ์ž˜ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  2. ์ž๋ฌผ์‡ ์˜ ์ „์ฒด ํฌ๊ธฐ๋ฅผ ํ‚ค์›Œ์„œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ N, M ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  3. ์—ญ์‹œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ & ๊ตฌํ˜„ ๋ฌธ์ œ๋Š” ์–ด๋ ต๋‹ค.
๋ฐ˜์‘ํ˜•