https://school.programmers.co.kr/learn/courses/30/lessons/81302
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제
5*5행렬에 자리배치도가 있다.
문제 기준에 따라 거리두기를 지킨 대기실과 지키지 못한 대기실을 배열로 return하면 된다.
2. 문제 풀이 포인트
1. 전달받은 place를 순회해서 1차원 배열안에 있는 문자열을 2차원 배열화 해야한다.
2차원 배열이 주어지고 그 안에 있는 1차원 배열이 각 대기실 이다.
여기서 부터 난관이었다. 문자열 인덱스가 필요하고 위, 아래를 체크하기 위해서는 2차원 배열 형태여야한다.
2. 거리두기를 실천하지 않은 경우들을 모아 if문을 만든다.
주의할 점은 배열을 조회할 때, 인덱스를 초과해서 조회하면 오류가 난다는 것이다.
예를 들면, 맨 오른쪽 끝 인덱스에서 한칸 오른쪽 인덱스를 조회하면 배열 밖에 있는 것이기 때문에 배열 조회가 안된다.
거리두기를 지키지 않은 경우는 6가지 경우의 수가 있다.
코드가 복잡하여 그림참조 주석을 달아놨으니 참고하면 된다.
#맨해튼거리 2이하에 앉으면 안됨. |r1 - r2| + |c1 - c2|
#P:착석 O:빈자리 X:파티션
#파티션을 사이에 두고 앉으면 괜찮음.
#거리두기 지키고 있으면 1 안지키고 있으면 0 return
def check(place):
for idx_row, row in enumerate(place):
for idx_col,cell in enumerate(row):
if cell != 'P':
continue
isNotEndRow = idx_row != 4
isNotEndCol = idx_col != 4
isNotFirstCol = idx_col != 0
isBeforeThirdRow = idx_row < 3
isBeforeThirdCol = idx_col < 3
#D 한칸 아래 D2 두칸 아래
#R 한칸 오른쪽 R2 두칸 오른쪽
#L 한칸 왼쪽
#RD 한칸 오른쪽+한칸 밑, LD 한칸 왼쪽, 한칸 밑
if isNotEndRow:
D = place[idx_row + 1][idx_col]
if D == 'P': return 0 #그림참조 2번에 해당
if isNotFirstCol:
L = place[idx_row][idx_col-1]
LD = place[idx_row+1][idx_col-1]
if LD == 'P' and (D!= 'X' or L != 'X'): return 0 #그림참조 6번에 해당
if isNotEndCol:
R = place[idx_row][idx_col+1]
RD = place[idx_row+1][idx_col+1]
if RD == 'P' and (D!= 'X' or R != 'X'): return 0 #그림참조 5번에 해당
if isBeforeThirdRow:
D2 = place[idx_row+2][idx_col]
if D2 == 'P' and D!= 'X': return 0 #그림참조 3번에 해당
if isNotEndCol:
R = place[idx_row][idx_col+1]
if R == 'P': return 0 #그림참조 1번에 해당
if isBeforeThirdCol:
R2 = place[idx_row][idx_col+2]
if R2 == 'P' and R!='X': return 0 #그림참조 4에 해당
return 1
def solution(places):
answer = [check(place) for place in places]
return answer
if __name__ == '__main__':
result= solution([["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"]])
print(result)
3. 배워갈 내용
✔️2차원 배열을 순회하여 안에 있는 1차원 배열을 2차원 배열화 할 수 있다.
def check(place):
for idx_row, row in enumerate(place):
for idx_col,cell in enumerate(row):
이때, enumerate를 사용하여 index를 받아올 수 있다.
✔️BFS보다 배열 탐색이 효율적일 때도 있다.
BFS는 상하좌우 네 방향을 모두 탐색하지만, 경우의 수는 불가능한 조합만 검출하면 되므로 더 빠른 탐색이 가능하다.
'알고리즘&자료구조 > Algorithm' 카테고리의 다른 글
프로그래머스 12926 - 시저 암호 (0) | 2024.04.24 |
---|---|
프로그래머스 12949 - 행렬의 곱셈 (0) | 2024.04.24 |
프로그래머스 68645 - 삼각 달팽이 (0) | 2024.04.18 |
프로그래머스 77485 - 행렬 테두리 회전하기 (1) | 2024.04.18 |
프로그래머스 87377 - 교점에 별 만들기 (0) | 2024.04.18 |