이 영역을 누르면 첫 페이지로 이동
자라자 블로그의 첫 페이지로 이동

자라자

페이지 맨 위로 올라가기

자라자

개발자를 준비하는 자라자의 블로그입니다.

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

  • 2021.11.28 10:36
  • PS/Programmers

프로그래머스로고

[문제 링크]

https://programmers.co.kr/learn/courses/30/lessons/60059

[입출력 예]

key lock result
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

[소스코드]

def rotate(lock):
    rotated = [[ 0 for _ in range(len(lock))] for _ in range(len(lock))]
    for r in range(len(lock)):
        for c in range(len(lock)):
            rotated[len(lock)-1-c][r]=lock[r][c]
    return rotated

def check(lock_length,key_length,lock,key,delta_x,delta_y):
    for lock_x_idx , _ in enumerate(range(lock_length)):
        for lock_y_idx , _ in enumerate(range(lock_length)):

            key_x_idx = lock_x_idx -(delta_x)
            key_y_idx = lock_y_idx - (delta_y)

            if not (0<=key_x_idx<key_length and 0<=key_y_idx<key_length):
                # 5. key에서 인덱스가 벗어날 경우 lock 값만 가지고 판단
                if (lock[lock_x_idx][lock_y_idx]==0): return False

            # 6. 덧셈이 아니라 비트연산 XOR로 처리해주어야 한다.
            elif lock[lock_x_idx][lock_y_idx] ^ key[key_x_idx][key_y_idx]!=1:
                return False

    return True


def solution(key, lock):
    answer = False

    lock_length = len(lock)
    key_length = len(key)
    #1. lock의 좌표를 고정시키고 key만 움직이기
    # lock의 왼쪽 상단 좌표를 0,0으로 고정.
    # key의 왼쪽 상단 좌표의 범위는 -(key_length-1) ~ lock_length-1

    #2. 순회는 lock 기준으로 한다.
    #key가 -2,-2만큼 움직인 상태면 lock(0,0)과 key(-(-2),-(-2))의 값을 더해야 한다.
    #key의 범위에서 벗어나는 값을 요구하면 continue

    #3 세로축이 x축, 가로축이 y축, 음의 방향으로 증가

    #4. 한 위치에서 4방향으로 회전해서 맞는 경우 있나 보고 위치 바꾸기
    #반시계 회전은 f(x,y)->f(y,n-x)

    for delta_x in range(-(key_length-1),lock_length):
        for delta_y in range(-(key_length-1),lock_length):
            for _ in range(4):
                if check(lock_length,key_length,lock,key,delta_x,delta_y):
                    return True
                lock=rotate(lock)

    return False

'PS > Programmers' 카테고리의 다른 글

[프로그래머스] 보석 쇼핑 파이썬 풀이  (0) 2021.12.09
[프로그래머스] 셔틀버스  (0) 2021.12.08
[프로그래머스] 순위  (0) 2021.11.27
[프로그래머스] 네트워크 파이썬  (0) 2021.11.27
[프로그래머스] 정수삼각형 파이썬 풀이  (0) 2021.11.27

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [프로그래머스] 보석 쇼핑 파이썬 풀이

    [프로그래머스] 보석 쇼핑 파이썬 풀이

    2021.12.09
  • [프로그래머스] 셔틀버스

    [프로그래머스] 셔틀버스

    2021.12.08
  • [프로그래머스] 순위

    [프로그래머스] 순위

    2021.11.27
  • [프로그래머스] 네트워크 파이썬

    [프로그래머스] 네트워크 파이썬

    2021.11.27
다른 글 더 둘러보기

정보

자라자 블로그의 첫 페이지로 이동

자라자

  • 자라자의 첫 페이지로 이동

검색

메뉴

  • 🏠 HOME
  • 💡 ABOUT
  • 💻 GITHUB

카테고리

  • 분류 전체보기 (91)
    • Tech Note (3)
    • Dev Log (11)
    • Study Log (11)
    • Settings (3)
    • PS (53)
      • Programmers (21)
      • BOJ (32)
    • Diary (10)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 공식문서읽기
  • 리액트
  • ㅣ

나의 외부 링크

정보

자라자의 자라자

자라자

자라자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 자라자. Designed by Fraccino.

티스토리툴바