본문 바로가기
algorithm/programmers

거리두기 확인하기 [프로그래머스]

by hoonzii 2021. 11. 29.
반응형

문제 풀이

문제 풀이 자체가 별로 없다.

P의 위치를 좌표 평면에서 x=0, y=0 이라고 했을때 맨하튼 거리가 2 이내 인 곳은 총 12 군데로

  1. west ⇒ [-2,0] , [-1,0]
  2. southwest ⇒ [-1,-1]
  3. south ⇒ [0, -2] , [0, -1]
  4. southeast ⇒ [+1, -1]
  5. east ⇒ [+2,0], [+1,0]
  6. northeast ⇒ [+1,+1]
  7. north ⇒ [0,+2], [0+1]
  8. northwest ⇒ [-1,+1]

이렇게 총 12개의 공간을 확인해야 한다.

 

1, 3, 5, 7 번의 공간의 경우 맨하튼 거리가 1인 경우 P가 존재한다면 무조건 False

맨하튼 거리가 2인 경우 P가 존재한다면 중간 공간의 값이 X가 아니라면 무조건 False

 

2, 4, 6, 8 번의 공간의 경우 대각선으로 X가 존재하지 않으면 무조건 False

 

위 12개의 공간에 대해 위 조건을 만족하는지 확인하는 valid_place 함수를 작성했다.

 

코드

def valid_place(x,y, places):
    valid = True
    
    # west-2
    if 0 <= x-2 < 5: #places[x-2][y] != None:
        if places[x-2][y] == "P":
            if places[x-1][y] == "X":
                valid=True
            else:
                valid=False
                return valid
    # west-1    
    if 0 <= x-1 < 5: #places[x-1][y] != None:
        if places[x-1][y] == "P":
            valid = False
            return valid
        
    #west-south
    if 0<= x-1 <5 and 0<=y-1 < 5: #places[x-1][y-1] != None:
        if places[x-1][y-1] == "P":
            if places[x-1][y] == "X" and places[x][y-1] == "X":
                valid = True
            else:
                valid = False
                return valid
    #south-2
    if 0<=y-2<5: #places[x][y-2] != None:
        if places[x][y-2] == "P":
            if places[x][y-1] == "X":
                valid = True
            else:
                valid = False
                return valid
        
    #south-1
    if 0 <= y-1 < 5: #places[x][y-1] != None:
        if places[x][y-1] == "P":
            valid = False
            return valid
        
    #south-east
    if 0<= x+1 < 5 and 0 <= y-1 <= 5: #places[x+1][y-1] != None:
        if places[x+1][y-1] == "P":
            if places[x+1][y] == "X" and places[x][y-1] == "X":
                valid = True
            else:
                valid = False
                return valid
    #east-2
    if 0<= x+2 < 5: #places[x+2][y] != None:
        if places[x+2][y] == "P":
            if places[x+1][y] == "X":
                valid = True
            else:
                valid = False
                return valid
    #east-1
    if 0<= x+1 < 5: #places[x+1][y] != None:
        if places[x+1][y] == "P":
            valid = False
            return valid
        
    
    #east-north
    if 0<= x+1 < 5 and 0<= y+1 < 5: #places[x+1][y+1] != None:
        if places[x+1][y+1] == "P":
            if places[x+1][y] == "X" and places[x][y+1] == "X":
                valid = True
            else:
                valid = False
                return valid
    
    #north-2
    if 0<= y+2 < 5: #places[x][y+2] != None:
        if places[x][y+2] == "P":
            if places[x][y+1] == "X":
                valid = True
            else:
                valid = False
                return valid
    # north-1
    if 0 <= y+1 < 5: #places[x][y+1] != None:
        if places[x][y+1] == "P":
            valid = False
            return valid
        else:
            valid = True
            
    # north-west    
    if 0<= x-1 < 5 and 0<= y+1 < 5:#places[x-1][y+1] != None:
        if places[x-1][y+1] == "P":
            if places[x-1][y] == "X" and places[x][y+1] == "X":
                valid=True
            else:
                valid=False
                return valid
            
    return valid

def solution(places):
    answer = []
    
    for room in places:
        room_matrix = []
        for obj in room:
            temp = []
            for a in obj:
                temp.append(a)
            room_matrix.append(temp)

        flag = 1
        for i in range(5):
            for j in range(5):
                if room_matrix[i][j] == "P":
                    if not valid_place(i,j,room_matrix):
                        flag = 0
        answer.append(flag)
        
    return answer

 

결과는 통과~!

 

문제는 여기

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

 

반응형

댓글