728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
단순하게 구현해도 풀 수 있는 문제.
BFS를 따로 활용할 필요 없이 조건문을 통해 구현할 수 있는 문제다.
풀이 코드
# person(P의 좌표)에서 맨해튼 거리가 1, 2인 좌표들을 담은 리스트 close_list에 있는 좌표들이 실제로 거리두기가 지켜지고 있는지 확인하는 함수
# 거리두기가 지켜지고 있다면 1 리턴, 그렇지 않다면 0 리턴
def is_safe(place, person, close_list):
x = person[0]
y = person[1]
# close_list가 비어있다면 거리두기가 지켜지고 있는 것이므로 1 리턴
for coord in close_list:
test_x = coord[0]
test_y = coord[1]
# 세로로만 차이나는 경우
if x == test_x:
# 세로로 1 차이나는 경우
if abs(y - test_y) == 1:
return 0
# 세로로 2 차이나는 경우
else:
if y > test_y:
if place[x][y-1] == 'O':
return 0
else:
if place[x][y+1] == 'O':
return 0
# 가로로만 차이나는 경우
elif y == test_y:
# 가로로 1 차이나는 경우
if abs(x - test_x) == 1:
return 0
# 가로로 2 차이나는 경우
else:
if x > test_x:
if place[x-1][y] == 'O':
return 0
else:
if place[x+1][y] == 'O':
return 0
# 가로 1, 세로 1만큼 차이나는 경우
else:
if x > test_x:
if y > test_y:
if place[x-1][y] == 'O' or place[x][y-1] == 'O':
return 0
else:
if place[x-1][y] == 'O' or place[x][y+1] == 'O':
return 0
else:
if y > test_y:
if place[x+1][y] == 'O' or place[x][y-1] == 'O':
return 0
else:
if place[x+1][y] == 'O' or place[x][y+1] == 'O':
return 0
return 1
# (x, y)에 대해 맨해튼 거리가 1이상 2 이하이고 다른 응시자가 위치한 좌표들을 담은 리스트를 리턴하는 함수
def get_close_list(x, y, person_list):
candidate_list = []
for i in range(5):
for j in range(5):
if 1 <= abs(x-i) + abs(y-j) <= 2 and (i, j) in person_list:
candidate_list.append((i, j))
return candidate_list
def solution(places):
answer = []
for k in range(len(places)):
place = places[k]
person_list = [] # 각 place에 대해 P의 좌표를 저장하는 리스트
for i in range(5):
for j in range(5):
if place[i][j] == 'P':
person_list.append((i, j))
is_ok = True # 각 place에 대해 거리두기 지켜지고 있다면 True, 아니면 False
for person in person_list:
close_list = get_close_list(person[0], person[1], person_list) # place의 각 person에 대해 맨해튼 거리가 1, 2이고 다른 person이 위치한 좌표를 저장하는 리스트
if not is_safe(place, person, close_list): # 거리두기가 지켜지지 않는 사람이 한 쌍이라도 있는 경우
is_ok = False # is_ok = False로 변경
break
if is_ok: # 거리두기가 지켜지는 경우
answer.append(1)
else: # 거리두기가 지켜지지 않는 사람이 한 쌍이라도 있는 경우
answer.append(0)
# print("===================")
return answer
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
가장 큰 정사각형 찾기 (0) | 2024.07.09 |
---|---|
리코쳇 로봇 (0) | 2024.07.06 |
미로 탈출 (0) | 2024.07.02 |
행렬 테두리 회전하기 (0) | 2024.07.01 |
괄호 변환 (0) | 2024.06.28 |