반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 프로그래밍
- 동적계획법
- Level2
- sql
- 리액트
- Doitvue.js입문
- VUE
- typescript
- 코테연습
- 파이썬
- 자바스크립트
- Medium
- python
- 웹프로그래밍
- 리트코드
- C++
- 카카오
- dp
- Level3
- Level1
- javascript
- OS
- CS
- 프로그래머스
- 고득점Kit
- 백준
- react
- LeetCode
- 배열
- web
Archives
- Today
- Total
[프로그래머스] 거리두기 확인하기 - python 본문
반응형
거리두기 확인하기
문제 설명
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼 아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
위 그림처럼 자리 사이에 파티션이 존재한다면 맨해튼 거리가 2여도 거리두기를 지킨 것입니다. | 위 그림처럼 파티션을 사이에 두고 앉은 경우도 거리두기를 지킨 것입니다. | 위 그림처럼 자리 사이가 맨해튼 거리 2이고 사이에 빈 테이블이 있는 경우는 거리두기를 지키지 않은 것입니다. |
빈 테이블(O)을 의미합니다. | 파티션(X)을 의미합니다. |
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
- places의 행 길이(대기실 개수) = 5
- places의 각 행은 하나의 대기실 구조를 나타냅니다.
- places의 열 길이(대기실 세로 길이) = 5
- places의 원소는
- places 원소의 길이(대기실 가로 길이) = 5
- P는 응시자가 앉아있는 자리를 의미합니다.
- O는 빈 테이블을 의미합니다.
- X는 파티션을 의미합니다.
- P,O,X로 이루어진 문자열입니다.
- 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
- return 값 형식
- 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
- places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
- 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
풀이
5 X 5 맵을 만든 뒤 전체를 탐색하면서 응시자를 찾아서 자리 두기가 지켜졌는지 체크한다.
case를 3개로 나눠서 체크했다.
- 상하좌우에 다른 응시자가 있을 경우: 무조건 False
- 상하좌우 대각선에 다른 응시자가 있을 경우: 위 아래에 파티션 없으면 False
- 상하좌우 1칸을 사이에 두고 다른 응시자가 있을 경우: 사이에 파티션 없으면 False
def check_distance(x, y, board):
case1 = [(1, 0), (-1, 0), (0, -1), (0, 1)]
case2 = [(-1, -1), (1, 1), (1, -1), (-1, 1)]
case3 = [(2, 0), (-2, 0), (0, 2), (0, -2)]
for dx, dy in case1:
nx = x + dx
ny = y + dy
if 0 <= nx < 5 and 0 <= ny < 5 and board[nx][ny] == 'P':
return 0
for dx, dy in case2:
nx = x + dx
ny = y + dy
if 0 <= nx < 5 and 0 <= ny < 5 and board[nx][ny] == 'P':
if board[x + dx][y] != 'X' or board[x][y + dy] != 'X':
return 0
for dx, dy in case3:
nx = x + dx
ny = y + dy
if 0 <= nx < 5 and 0 <= ny < 5 and board[nx][ny] == 'P':
if dx != 0:
if dx > 0 and board[x + dx - 1][y] != 'X':
return 0
if dx < 0 and board[x + dx + 1][y] != 'X':
return 0
else:
if dy > 0 and board[x][y + dy - 1] != 'X':
return 0
if dy < 0 and board[x][y + dy + 1] != 'X':
return 0
return 1
def solution(places):
answer = []
for p in places:
board = [list(row) for row in p]
tmp = True
for i in range(5):
for j in range(5):
if board[i][j] == 'P':
if check_distance(i, j, board) == 0:
tmp = False
break
answer.append(int(tmp))
return answer
한 명이라도 지키지 않으면 0을 담아야 하므로 0이 한 번 나오면 더 이상 tmp 값이 바뀌지 말아야한다. 처음에는 아무 생각 없이 check_distance(i, j, board) 결과값을 tmp에 매번 갱신 시켜줬다가 틀렸다.
반응형
'코테 문제 풀이' 카테고리의 다른 글
[프로그래머스] 튜플 - python (0) | 2022.04.06 |
---|---|
[프로그래머스] 수식 최대화 - python (0) | 2022.04.06 |
[프로그래머스] 뉴스 클러스터링 - python (0) | 2022.04.05 |
[프로그래머스] 괄호 변환 - python (0) | 2022.04.05 |
[프로그래머스] 메뉴 리뉴얼 - python (0) | 2022.04.05 |
Comments