728x90
https://programmers.co.kr/learn/courses/30/lessons/81302?language=python3
문제 풀이
BFS로도 풀 수 있지만 크기가 5로 고정되어있어 2중 반복문으로 풀었다.
for i in range(5):
for j in range(5):
if (place[i][j] == 'P'):
people.append([i,j])
대기실 전체를 돌아 사람의 위치를 확인해 (x, y) 좌표값으로 새로운 리스트에 넣어준다.
for i in range(len(people)-1):
x1, y1 = people[i]
for j in range(i+1, len(people)):
x2, y2 = people[j]
dist = abs(x1-x2) + abs(y1-y2)
if dist == 2:
if x2 == x1:
if place[x1][y2-1] == 'O': return 0
elif y2 == y1:
if place[x2-1][y1] == 'O': return 0
else:
if place[x1][y2] == 'O' or place[x2][y1] == 'O': return 0
elif dist == 1: return 0
1번 사람과 2번 사람의 맨해튼 거리가 2 이하인 경우만 따져주면 되기에 2중 포문으로 풀어주었다.
거리가 2이하일 때 경우에 따라 체크만 해주면 된다.
case 1 : x좌표가 같은 경우
case 2: y좌표가 같은 경우
case 3: x, y 좌표가 다른 경우
그리고 거리가 1이면 무조건 거리두기가 지켜지지 않은 것이므로 함수를 종료하면 된다!
느낀 점
처음에 생각한 풀이는 대기실을 돌아 사람일 때 주변에 모든 경우를 확인하는 것이었다.
하지만 너무 경우의 수가 많을 것 같아서 포기.
그 다음 생각해낸 풀이가 이 풀이이다!
머릿속에 풀이는 완벽했는데 자잘한 코드 실수가 계속 생겨나서 틀리고 틀리고를 또 반복했다.
너무 열이 받았다..
코드
def check(place):
people = []
for i in range(5):
for j in range(5):
if (place[i][j] == 'P'):
people.append([i,j])
for i in range(len(people)-1):
x1, y1 = people[i]
for j in range(i+1, len(people)):
x2, y2 = people[j]
dist = abs(x1-x2) + abs(y1-y2)
if dist == 2:
if x2 == x1:
if place[x1][y2-1] == 'O': return 0
elif y2 == y1:
if place[x2-1][y1] == 'O': return 0
else:
if place[x1][y2] == 'O' or place[x2][y1] == 'O': return 0
elif dist == 1: return 0
return 1
def solution(places):
answer = []
for place in places:
answer.append(check(place))
return answer
'문제 풀이 > 프로그래머스 (Programmers)' 카테고리의 다른 글
[Python] 프로그래머스 : 체육복 (0) | 2022.06.30 |
---|---|
[Python] 프로그래머스 : 수식 최대화 (0) | 2022.06.30 |
[Python] 프로그래머스 : 괄호 변환 (0) | 2022.06.23 |
[Python] 프로그래머스 : 메뉴 리뉴얼 (0) | 2022.06.22 |
[Python] 프로그래머스 : 내적 (0) | 2022.06.22 |
댓글