일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- IT
- programmers
- 자바
- 카카오
- 프로그래머스
- 프로그래머스 #카카오 #IT #코딩테스트
- Python
- 네트워크
- 백엔드
- 개발자
- 스프링
- Java
- 엘라스틱서치
- Linux
- 스프링부트
- C
- 쿠버네티스
- Elasticsearch
- 운영체제
- Kakao
- Spring
- 파이썬
- 도커
- docker
- 리눅스
- 캐시
- springboot
- 코딩테스트
- DPDK
- 알고리즘
- Today
- Total
저고데
[프로그래머스]자물쇠와 열쇠 본문
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/60059
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해당 열쇠가 자물쇠에 맞는지 알아보려면 열쇠를 90도씩 돌려가면서 자물쇠에 포갰을 때, 겹치는 부분이 없이 모두 포개지는지 확인해야한다.
따라서 자물쇠의 길이보다 2*(열쇠의 길이-1)보다 더 긴 좌표를 만든다.
해당 좌표의 가운데에 자물쇠를 대입하고 좌표의 왼쪽 위에서부터 열쇠를 포개고 회전시키면서 자물쇠의 모든 값이 포개지면 True를 반환한다.
코드를 작성하기 위한 순서는 다음과 같다.
1. 더 긴 좌표를 생성한다.
2. 좌표의 가운데에 자물쇠를 대입한다.
3. 열쇠의 좌표를 시계방향으로 90도 회전시키는 함수 spin을 생성한다.
4. 열쇠와 자물쇠를 포갰을 때, 겹치는 부분이 없고 모두 포개진지 확인하는 함수 correct를 생성한다.
def spin(new, key, num, i, j): #3번
n = len(key)
for r in range(n):
for c in range(n):
if num == 0: #0도 회전할 때
new[r+i][c+j] += key[r][c]
elif num == 1: #90도 회전할 때
new[r+i][c+j] += key[n-1-c][r]
elif num == 2: #180도 회전할 때
new[r+i][c+j] += key[n-1-r][n-1-c]
else: #270도 회전할 때
new[r+i][c+j] += key[c][n-1-r]
def correct(new, init, n): #4번
for i in range(n):
for j in range(n):
if new[init+i][init+j] != 1: #하나라도 겹치거나 포개지지 않으면 False를 반환한다.
return False
return True
def solution(key, lock):
init = len(key)-1
for i in range(init+len(lock)):
for j in range(init+len(lock)):
for num in range(4):
new = [[0 for _ in range(60)] for _ in range(60)] #1번 : 문제의 최대 길이가 20이므로 20*3을 하여 넉넉하게 60으로 긴 좌표를 생성하였다.
for r in range(len(lock)):
for c in range(len(lock)):
new[init+r][init+c] = lock[r][c] #2번
spin(new, key, num, i, j)
if correct(new, init, len(lock)): #열쇠와 자물쇠가 하나라도 맞을 경우, True를 반환하여 코드를 종료한다.
return True
return False
배열을 깔끔하게 잘 정리하면 어렵지 않게 해결할 수 있는 문제였다.
그리고 열쇠 좌표를 회전시키고 더 큰 좌표를 만들어주는 것이 핵심이었다.
열쇠를 회전시키는 경우
def spin(key):
new = [[0 for _ in range(len(key))] for _ in range(len(key))]
row = []
for i in key:
row.append(i)
k = 0
for i in range(len(key)-1, -1, -1):
for j in range(len(key)):
new[j][i] = row[k][j]
k += 1
return new
해당 코드와 같이 한 줄을 빼서 다시 넣는 식으로 작성하였다.
하지만 유튜브를 보던 중, 이보다 더 헷갈리지 않고 좋은 방법을 찾아서 바로 수정하였다.
직관적으로 보았을 때는 감은 알겠지만 아직 정확히 이해는 하지 못하겠다. (역시 대기업 개발자는 다르네요 ㅠㅠ ezsw님 사랑해요 ㅎ)
그래도 두고두고 유용하게 사용될 것 같아서 처음에는 외워야할 듯하다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스]디펜스 게임 (0) | 2023.03.04 |
---|---|
[프로그래머스]길 찾기 게임 (0) | 2023.02.15 |
[프로그래머스]무인도 여행 (1) | 2023.02.15 |
[프로그래머스]표 편집 (0) | 2023.02.14 |
[프로그래머스]마법의 엘리베이터 (0) | 2023.02.14 |