저고데

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

프로그래머스

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

진철 2023. 2. 11. 23:26
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/81302

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드를 작성하기 위한 순서는 다음과 같다.

1. 좌표값이 P인 경우, 멘허튼 거리가 1인 지점(상하좌우)에 X가 있는 지 확인한다. (X가 있으면 P X P와 같은 경우에도 거리두기를 지켜지는 것이기 때문에 거리가 2인 곳에 P가 있어도 맞는 경우이다.)

2. 멘허튼 거리가 1인 지점에 O가 있다면 O를 기준으로 멘허튼 거리가 1인 지점(상하좌우 중, 현재 해당하는 좌표 제외)에 P가 있는 지 확인하고 있다면 answer에 0을 append한다.

def limit(x, y): #해당 좌표가 5*5를 넘어가는 지 확인하는 함수이다.
    if x<0 or x>4 or y<0 or y>4:
        return False
    return True

def check(x, y, k): #거리두기가 올바르게 지켜지는 지 확인하는 함수이다.
    yes=[]
    if limit(x+1,y): #현재 P인 좌표에서 아랫쪽의 좌표를 확인하는 부분이다.
        if k[x+1][y]=='X': #1번
            yes.append('X')
        elif k[x+1][y]=='P':
            return False
        else: #2번
            if (x+2<=4 and k[x+2][y]=='P') or (y-1>=0 and k[x+1][y-1]=='P') or (y+1<=4 and k[x+1][y+1]=='P'):
                return False
                
    if limit(x-1,y): #현재 P인 좌표에서 윗쪽의 좌표를 확인하는 부분이다.
        if k[x-1][y]=='X':
            yes.append('X')
        elif k[x-1][y]=='P':
            return False
        else:
            if (x-2>=0 and k[x-2][y]=='P') or (y-1>=0 and k[x-1][y-1]=='P') or (y+1<=4 and k[x-1][y+1]=='P'):
                return False
                
    if limit(x, y+1): #현재 P인 좌표에서 오른쪽의 좌표를 확인하는 부분이다.
        if k[x][y+1]=='X':
            yes.append('X')
        elif k[x][y+1]=='P':
            return False
        else:
            if (y+2<=4 and k[x][y+2]=='P') or (x-1>=0 and k[x-1][y+1]=='P') or (x+1<=4 and k[x+1][y+1]=='P'):
                return False
                
    if limit(x, y-1): #현재 P인 좌표에서 왼쪽의 좌표를 확인하는 부분이다.
        if k[x][y-1]=='X':
            yes.append('X')
        elif k[x][y-1]=='P':
            return False
        else:
            if (y-2>=0 and k[x][y-2]=='P') or (x-1>=0 and k[x-1][y-1]=='P') or (x+1<=4 and k[x+1][y-1]=='P'):
                return False
            
    return True
    
def solution(places):
    answer = []
    for k in places:
        fast=True #한 사람이라도 거리두기를 지키지 않으면 결과를 낼 수 있기 때문에 이를 판별하기 위한 변수이다.
        for i in range(len(k)):
            for j in range(len(k[i])):
                if k[i][j]=='P':
                    if check(i, j, k)==False: #한 명이라도 거리두기를 지키지 않은 경우이다.
                        fast=False
                        break
            if fast==False:
                answer.append(0)
                break
        if fast:
            answer.append(1)
                    
    return answer

결론부터 말하자면 좋게 작성한 코드는 아닌 것 같다.

현재 P인 좌표에서 상하좌우를 판단할 때, 다른 함수를 만들어서 작성했더라면 조금 더 나은 코드가 되지 않았을까 아쉬움이 든다.

또한 bfs를 사용하면 이보다 깔끔한 코드를 작성할 수 있는데, 이제야 dfs 함수를 조금이나 구현할 수 있는 실력이기에 많이 노력해야할 것 같다.

이론보다는 실전에 응용할 수 있도록 손으로 공부하는 것이 아닌 컴퓨터로 공부해야 좋은 개발자로 성정할 수 있지 않을까 생각이 든다. (그래도 맞춰서 기분은 좋았습니다 허허허)

728x90
반응형