개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places
가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
places
의 행 길이(대기실 개수) = 5
places
의 각 행은 하나의 대기실 구조를 나타냅니다.places
의 열 길이(대기실 세로 길이) = 5
places
의 원소는 P,O,X로 이루어진 문자열입니다.
places
원소의 길이(대기실 가로 길이) = 5P
는 응시자가 앉아있는 자리를 의미합니다.O
는 빈 테이블을 의미합니다.X
는 파티션을 의미합니다.입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
return 값 형식
places
에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.입출력 예 #1
첫 번째 대기실
#테두리를 늘린 새로운 케이스 생성
def extend_place(places) :
new_place = []
for _ in range(2) :
new_place.append("XXXXXXXXX")
for p in places :
n = "XX" + p + "XX"
new_place.append(n)
for _ in range(2) :
new_place.append("XXXXXXXXX")
return new_place
#P 위치 찾기
def find_P(place) :
p = []
for i in range(len(place)) :
for j in range(len(place[0])) :
if place[i][j] == "P" :
p.append((i,j))
return p
#거리두기 체크하기(모든 경우)
def check_all(position,place):
result = 1
for i in range(len(position)-1) :
c1 = position[i]
for j in range(i+1,len(position)):
c2 = position[j]
distance = abs(c1[0]-c2[0]) + abs(c1[1] - c2[1])
if distance > 2 :
continue
elif distance == 1:
return 0
else :
result = check(c1,c2,place)
if result == 0 :
return 0
return result
#거리두기 체크하기(거리가 2인 경우)
def check(c1,c2,place):
#case 1
if c1[0] == c2[0] :
if place[c1[0]][c1[1]+1] == "X" :
return 1
else :
return 0
#case 2
elif c1[1] == c2[1] :
if place[c1[0]+1][c1[1]] == "X" :
return 1
else :
return 0
#case 3, 4
else :
if place[c1[0]+1][c1[1]] == "O" :
return 0
else :
if c1[1] > c2[1] :
if place[c1[0]][c2[1]] == "O" :
return 0
else :
return 1
else :
if place[c1[0]][c2[1]] == "O" :
return 0
else :
return 1
def solution(places):
answer = []
for case in places:
new_place = extend_place(case)
position_p = find_P(new_place)
answer.append(check_all(position_p,new_place))
return answer
다소 복잡하게 생겼지만, 3단계에 걸쳐 진행이 되고 있는 코드이다.
places
에서 받아온 각각의 대기실을 확장한다.
코드 상으로 extend_place
함수를 통해 이뤄지고 있는 부분으로, P가 테두리에 있는 경우, 위치에 따라서 판단하지 못하는 부분을 없애기 위해 주변 두칸까지 전부 X
로 둘러싼 새로운 대기실 생성
확장한 대기실 new_place
에서 find_P
함수를 통해 P의 위치를 판단 후 리스트에 저장
각각의 P
의 맨해튼 거리를 고려하여 거리두기를 지키는 지 판단, 결과를 저장
코드 상으로 check_all
함수와 check
함수에서 진행되고 있는 부분이다. 두 P
의 위치관계가 1이라면, 무조건 0을 리턴하게 되고, 2보다 큰 경우에는 판단할 이유가 없으므로 넘기고, 2인 경우 check
함수를 통해 거리두기를 지키고 있는 지 판단하여 결과를 얻어내는 과정이다.
모든 P
의 경우를 판단하여 문제를 해결하였는데, 내가 보기에도 코드가 너무 복잡하게 짜여져 있는 느낌이다. 다른 사람의 풀이를 보면서 더 괜찮은 방법이 있는지 찾아봐야겠다...해결하긴 했지만 너무 아쉬운 느낌😂 여전히 많이 부족함을 느꼈다!