프로그래머스 81302 - 거리두기 확인하기

2024. 4. 19. 18:13· 알고리즘&자료구조/Algorithm
목차
  1. 1. 문제
  2. 2. 문제 풀이 포인트
  3. 3. 배워갈 내용
728x90

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는 상하좌우 네 방향을 모두 탐색하지만, 경우의 수는 불가능한 조합만 검출하면 되므로 더 빠른 탐색이 가능하다.

728x90

'알고리즘&자료구조 > 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
  1. 1. 문제
  2. 2. 문제 풀이 포인트
  3. 3. 배워갈 내용
'알고리즘&자료구조/Algorithm' 카테고리의 다른 글
  • 프로그래머스 12926 - 시저 암호
  • 프로그래머스 12949 - 행렬의 곱셈
  • 프로그래머스 68645 - 삼각 달팽이
  • 프로그래머스 77485 - 행렬 테두리 회전하기
백엔드 개발자 - 젤리곰
백엔드 개발자 - 젤리곰
오늘도 배움이 있는 하루가 되길 바라는 개발자
백엔드 개발자 - 젤리곰
backend-gummyBear
백엔드 개발자 - 젤리곰
전체
오늘
어제
  • 분류 전체보기 (147)
    • 인프런 김영한 강의 정리 (60)
      • 스프링 핵심원리 기본편 (12)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 (10)
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (3)
      • 자바 ORM 표준 JPA 프로그래밍 기본편 (28)
      • 실전! Querydsl (6)
    • Spring (2)
    • 프로젝트일지 (6)
    • 프로그래밍 언어 (20)
      • Java (17)
      • JavaScript (3)
      • Python (0)
    • 데이터베이스 (4)
      • Oracle (2)
      • ORM (1)
      • SQL 튜닝 (1)
    • 형상관리 (1)
      • Git (0)
    • 알고리즘&자료구조 (34)
      • Algorithm (31)
      • Data Structure (1)
    • CS지식 (4)
    • Cloud (7)
    • 일기 (8)
      • 공부 일기 (3)
      • 독서 일기 (2)
      • 마음 일기 (3)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • ORM프레임워크
  • SublimeText단축키
  • 데이터베이스정규화
  • 인프콘
  • 프론트엔드역사
  • 스프링컨텍스트
  • 다운캐스팅
  • #{}와${}의차이
  • 객체지향방법론
  • 객체지향의사실과오해
  • 클라이언트서버통신
  • 커스텀annotation
  • LeetCode200번
  • LeetCode17번
  • 프론트엔드개발자업무
  • 업캐스팅
  • jquery와javascript
  • dfs알고리즘
  • 힙자료구조
  • 인터페이스

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
백엔드 개발자 - 젤리곰
프로그래머스 81302 - 거리두기 확인하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.