새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[프로그래머스] 자물쇠와 열쇠

by 언호 2022. 2. 14.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

키가 회전이 가능하므로 회전했을때 모습을 구하였습니다.

키를 자물쇠 가장 오른쪽 하단부터 한칸씩 이동하며 열수 있는지 없는지 판별하였습니다.

2) 알고리즘

  • 구현

3) 풀이 코드

사용 언어 - Python

def solution(key, lock):
    K, L = len(key), len(lock)                                  # 키와 자물쇠의 한변의 길이

    keys = [[[0] * K for _ in range(K)] for _ in range(4)]      # 회전한 키의 모양들을 담을 리스트

    for i in range(K):
        for j in range(K):
            keys[0][i][j] = key[i][j]               # 정방향
            keys[1][i][j] = key[K-1-j][i]           # 90도 회전
            keys[2][i][j] = key[K-1-i][K-1-j]       # 180도 회전
            keys[3][i][j] = key[j][K-1-i]           # 270도 회전

    def can_open(y, x):                                         # 자물쇠를 열 수 있는지 확인하는 함수
        r, c = y, x                                             # 키 정보가 담긴 배열의 행과 열
        for i in range(L):                                      # 자물쇠의 크기만큼 반복
            for j in range(L):
                if 0 <= r < K and 0 <= c < K:                   # 키의 인덱스가 배열 내의 범위라면
                    if lock[i][j] and keys[t][r][c]:            # 자물쇠와 키가 돌기라면, False 반환
                        return False
                    elif not lock[i][j] and not keys[t][r][c]:  # 자물쇠와 키가 홈이라면, False 반환
                        return False
                elif not lock[i][j]:                            # 자물쇠가 홈이라면, False 반환
                    return False
                c += 1                                          # 열 인덱스 증가
            c = x                                               # 새로운 행이므로 열 초기값으로 다시 할당 및 행 증가
            r += 1
        return True                                             # 자물쇠를 열 수 있다면, True 반환

    for y in range(-L, K):              # 키가 오른쪽 아래부터 시작
        for x in range(-L, K):
            for t in range(4):          # 회전한 4개의 키를 모두 확인해야함
                if can_open(y, x):      # 자물쇠를 열 수 있다면 True 반환하며 종료
                    return True

    return False                        # 자물쇠를 열 수 없다면 False 반환

print(solution([[0, 0, 0], [1, 0, 0], [0, 1, 1]], [[1, 1, 1], [1, 1, 0], [1, 0, 1]]))

📝 결과 및 학습한 내용

1) 어려웠던 내용

회전한 키의 모양을 만들기 위한 인덱스 관리와, 자물쇠에 열쇠를 맞추어 보기 위한 인덱스 관리에 다소 어려움을 겪었습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- 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

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[프로그래머스] 불량 사용자  (0) 2022.02.16
[프로그래머스] 보석 쇼핑  (0) 2022.02.15
[프로그래머스] 길 찾기 게임  (0) 2022.02.13
[백준] 13549 숨바꼭질 3  (0) 2022.02.12
[백준] 1701 Cubeditor  (0) 2022.02.11

댓글