[프로그래머스] Level2, 거리두기 확인하기 (Python)

2021. 8. 25. 12:15·알고리즘/프로그래머스
728x90
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/81302?language=python3 

 

코딩테스트 연습 - 거리두기 확인하기

[["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

 

코드

import collections
def solution(places):
    n = len(places)
    answer = []
    dx, dy = [-1,1,0,0], [0,0,-1,1] # 상하좌우
    d_x, d_y = [-1,-1,1,1], [-1,1,-1,1] # 대각선
    
    for i in places:
        graph = []
        for j in i:
            graph.append(list(j))
            
        queue = collections.deque()
        
        for x in range(len(graph)):
            for y in range(len(graph)):
                if graph[x][y] == 'P':
                    queue.append((x,y))
                    
        def bfs():
            while queue:
                x,y = queue.popleft()
                for k in range(4): # 상하좌우 확인
                    temp_x, temp_y = x,y
                    for _ in range(2): # 상하좌우는 2거리 까지 확인해야함
                        nx = temp_x + dx[k]
                        ny = temp_y + dy[k]
                        if 0 <= nx < n and  0 <= ny < n:
                            if graph[nx][ny] == 'X': # X에 막혀있으면 더이상 갈 필요없어서 break
                                break
                            elif graph[nx][ny] == 'P': # P를 만나면 거리두기를 안지켰으므로 False
                                return False
                            temp_x, temp_y = nx, ny
                        else:
                            break
                            
                for k in range(4): # 대각선 확인
                    n_x = x + d_x[k]
                    n_y = y + d_y[k]
                    if 0 <= n_x < n and  0 <= n_y < n:
                        if graph[n_x][n_y] == 'P': # 대각선이 P일 경우 x,y와 n_x, n_y 근처 두곳이 모두 X여야만 한다.
                            if graph[n_x - d_x[k]][n_y] == 'X' and graph[n_x][n_y  - d_y[k]] == 'X':
                                continue
                            else: # 두곳중 한곳이라도 X가 아니면 False
                                return False
            return True
        check = bfs()
        if check:
            answer.append(1)
        else:
            answer.append(0)
    return answer

 

'P' 에서 시작하여 상하좌우 로는 2거리 까지 확인하여 'P'가 있는지 찾아야 하고

 

대각선으로는 1거리 까지 확인하여 'P'가 있는지 찾아야 한다. 대각선에 'P'가 존재해도 근처 두 곳에 'X'가 있다면 괜찮다.

 

근처 두곳은 대각선 움직인 d_x[k], d_y[k]를 다시 한 좌표씩 빼주면 찾을 수 있다. 

반응형
저작자표시 (새창열림)

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] Level3, 불량 사용자 (Python)  (0) 2021.09.10
[프로그래머스] Level2, 수식최대화 (Python)  (0) 2021.09.10
[프로그래머스] Level3, 자물쇠와 열쇠 (Python)  (0) 2021.08.10
[프로그래머스] Level3, 합승 택시 요금 (Python)  (0) 2021.08.10
[프로그래머스] Level 2, 메뉴 리뉴얼 (Python)  (0) 2021.08.05
'알고리즘/프로그래머스' 카테고리의 다른 글
  • [프로그래머스] Level3, 불량 사용자 (Python)
  • [프로그래머스] Level2, 수식최대화 (Python)
  • [프로그래머스] Level3, 자물쇠와 열쇠 (Python)
  • [프로그래머스] Level3, 합승 택시 요금 (Python)
wookcode
wookcode
공부한 내용들을 정리하고 기록하는 블로그입니다.
    반응형
  • wookcode
    wookcode
    wookcode
  • 전체
    오늘
    어제
    • 카테고리 (196) N
      • study (1) N
        • 아파치 카프카 애플리케이션 프로그래밍 with 자.. (0)
        • 인프런 (1) N
      • Live Study (15)
      • Programming (14)
        • Java (8)
        • Python (1)
        • Springboot (5)
        • MSA (0)
      • 알고리즘 (117)
        • 백준 (58)
        • 프로그래머스 (59)
      • 에러로그 (5)
      • 항해99 (23)
      • 면접 (1)
      • 프로젝트 (1)
      • CS (19)
        • 네트워크 (2)
        • 운영체제 (2)
        • 데이터베이스 (2)
        • 컴퓨터구조 (1)
        • Java (8)
        • Spring (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SpringBoot
    정리
    백준
    orm
    괄호
    항해마켓
    인프런
    에러
    spring
    그리디
    SFlash
    프로그래머스
    회고
    미니프로젝트
    jpa
    항해99
    해결
    알고리즘
    실전프로젝트
    후기
    코딩테스트
    java
    김영한
    카카오인턴
    카카오코딩테스트
    브루트포스
    버그
    스파르타코딩클럽
    파이썬
    조합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
wookcode
[프로그래머스] Level2, 거리두기 확인하기 (Python)
상단으로

티스토리툴바