일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 네트워크 관리사 2급
- 카카오
- SSAFY
- IT 동향
- 인앱결제
- IT 트렌드
- 코테
- Java
- 신문스크랩
- 프로그래머스
- SSAFYcial
- 싸피
- 신문 스크랩
- html
- 네트워크 관리사 2급 실기
- 싸피셜
- it 이슈
- 백준위
- it 뉴스
- 코딩테스트 연습
- 네트워크 관리사
- java 객체지향 프로그래밍
- KT
- 우테코
- 코딩테스트
- SSAFY 7기
- 구글
- 리얼클래스
- 백준
- python
- Today
- Total
개발자일걸요..?
거리두기 확인하기 본문
링크 : https://programmers.co.kr/learn/courses/30/lessons/81302
코딩테스트 연습 - 거리두기 확인하기
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]
programmers.co.kr
(프로그래머스 > 코딩테스트 연습> 카카오 채용연계형 인턴십 > 거리두기 확인하기)
<문제>
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
위 그림처럼 자리 사이에 파티션이 존재한다면 맨해튼 거리가 2여도 거리두기를 지킨 것입니다. | 위 그림처럼 파티션을 사이에 두고 앉은 경우도 거리두기를 지킨 것입니다. | 위 그림처럼 자리 사이가 맨해튼 거리 2이고 사이에 빈 테이블이 있는 경우는 거리두기를 지키지 않은 것입니다. |
응시자가 앉아있는 자리(P)를 의미합니다. | 빈 테이블(O)을 의미합니다. | 파티션(X)을 의미합니다. |
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
- places의 행 길이(대기실 개수) = 5
- places의 각 행은 하나의 대기실 구조를 나타냅니다.
- places의 열 길이(대기실 세로 길이) = 5
- places의 원소는 P,O,X로 이루어진 문자열입니다.
- places 원소의 길이(대기실 가로 길이) = 5
- P는 응시자가 앉아있는 자리를 의미합니다.
- O는 빈 테이블을 의미합니다.
- X는 파티션을 의미합니다.
- 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
- return 값 형식
- 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
- places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
- 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다
<내가 작성한 코드>
def solution(place):
answer =[]
for room in place:
person = []
for i in range(0,5):
for j in range(0,5):
if room[i][j] == "P":
person.append([i,j])
flag = True
for i in range(len(person)):
for j in range(i+1,len(person)):
if (abs(person[i][0]-person[j][0])+abs(person[i][1]-person[j][1]))<=2:
if person[i][0]==person[j][0]:
if room[person[i][0]][(person[i][1]+person[j][1])//2]!="X":
flag = False
break
elif person[i][1] == person[j][1]:
if room[(person[i][0]+person[j][0])//2][person[i][1]]!="X":
flag = False
break
elif person[i][0]+1 == person[j][0] and person[i][1]+1 == person[j][1]:
if not(room[person[i][0]][person[j][1]]=="X" and room[person[j][0]][person[i][1]]=="X"):
flag = False
break
elif person[i][0] +1== person[j][0] and person[i][1] == person[j][1]+1:
if not(room[person[j][0]][person[i][1]]=="X" and room[person[i][0]][person[j][1]]=="X"):
flag = False
break
else:
flag = False
break
if flag==False:
break
answer.append(int(flag))
return answer
<문제에서 사용한 알고리즘>
1. 사람("P")의 위치를 배열(person)에 저장
2. person 안의 사람간의 맨해튼 거리를 계산한다.
3. 맨해튼 거리가 2이하일 경우, 예외의 경우 4가지를 제외하곤 False를 return 한다.
+) 예외 4가지
- i번째 사람과 j번째 사람의 x가 동일, y가 다를 경우 => i번째사람과 j번째 사람 사이가 "X"일때
- i번째 사람과 j 번째 사람의 y가 동일, x가 다를 경우 => i번째사람과 j번째 사람 사이가 "X"일때
- j번째 사람이 i번째 사람의 좌측 아래대각선방향에 있을 경우=> i번째사람 좌측과 j번째 사람 우측이 "X"일때
- j번째 사람이 i번째 사람의 우측 아래대각선방향에 있을 경우=> i번째사람 우측과 j번째 사람 좌측이 "X"일때