[프로그래머스(파이썬/Python)] 거리두기 확인하기(2021 카카오 개발자 인턴십)
kindof
·2021. 9. 6. 21:24
https://programmers.co.kr/learn/courses/30/lessons/81302
이 문제는 실제 인턴십 지원을 했을 때 봤던 코딩테스트에서 굉장히 빨리 풀었던 문제입니다. 그런데 지금 다시 풀어보니까 분명 그때보다 시간도 오래 걸리고, 코드도 조금 복잡하게 짠 것 같아서 약간 자괴감이 들었습니다...
이 문제에서 내가 중요하게 생각했던 로직은 각 방에 있는 좌표들을 왼쪽위부터 오른쪽아래로 탐색하면서 내려오기 때문에 모든 방향을 다 확인하지 않고, 각 지점에서 오른쪽, 아래, 대각선 왼쪽아래, 대각선 오른쪽 아래만 관찰하면 된다는 것이었습니다.
그리고 이 방향을 체크할 때는 1) 해당 좌표가 범위 안에 있는지, 2) 문제에서 요구한 거리두기 조건에 부합하지 않는지 체크하면 됩니다.
저같은 경우에는 오른쪽이나 아래 직선 방향에 위치하고 맨해튼 거리가 1이나 2인 자리는 있는 그대로 처리를 했고(로직 그대로) 대각선에 있는 경우에서 왼쪽 아래 대각선이면 바로 아래와 바로 왼쪽을 체크, 오른쪽 아래 대각선인 경우에는 아래와 바로 오른쪽만 체크하도록 구현했습니다.
PS. 사실 따져줘야하는 조건이 많지 않기 때문에 순수한 if문으로 문제를 해결할 수도 있고, BFS를 통해 거리가 2인 지점까지만 PP나 POP가 생기는지 관찰해줘도 됩니다.
[풀이]
def checkBounds(x, y):
return 0 <= x < 5 and 0 <= y < 5
def solution(places):
answer = []
# 각 지점에 대해 오른쪽, 아래, 대각선 왼쪽아래, 대각선 오른쪽 아래만 관찰
dx, dy = [0,1,1,1],[1,0,-1,1]
for room in places:
flag = True # 거리두기가 지켜졌는지 확인하는 플래그 변수
for i in range(5):
for j in range(5):
if room[i][j] != "P": continue
for d in range(4):
ni, nj = i + dx[d], j + dy[d]
if not checkBounds(ni,nj): continue
# 바로 오른쪽이나 아래에 사람이 있으면 False
if d == 0 or d == 1:
if room[ni][nj] == "P":
flag = False
break
else:
# 1만큼 더 간 지점에 사람이 있고 가운데는 빈 테이블이면 False
nni, nnj = ni + dx[d], nj + dy[d]
if not checkBounds(nni,nnj):continue
if room[ni][nj] + room[nni][nnj] == "OP":
flag = False
break
# 대각선에 왼쪽 아래 위치하고 부근에 파티션이 한 곳이라도 없으면 False
if d == 2 and room[ni][nj] == "P":
if room[i][j-1] != "X" or room[i+1][j] != "X":
flag = False
break
# 대각선에 오른쪽 아래 위치하고 부근에 파티션이 한 곳이라도 없으면 False
if d == 3 and room[ni][nj] == "P":
if room[i][j+1] != "X" or room[i+1][j] != "X":
flag = False
break
answer.append(1 if flag else 0)
return answer
'Algorithm' 카테고리의 다른 글
[프로그래머스(파이썬/Python)] 복서 정렬하기(위클리 챌린지 6주차) (0) | 2021.09.10 |
---|---|
[프로그래머스(파이썬/Python)] 길 찾기 게임(2019 카카오 블라인드) (0) | 2021.09.07 |
[프로그래머스(파이썬/Python)] 후보키(2019 카카오 블라인드) (0) | 2021.09.06 |
[프로그래머스(파이썬/Python)] 모음사전 (0) | 2021.09.06 |
[프로그래머스(파이썬/Python)] 보석 쇼핑(2020 카카오 개발자 인턴십) (0) | 2021.09.03 |