Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

개발계발

프로그래머스 - 거리두기 확인하기(81302) 본문

알고리즘

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

Ju_Nik_E 2024. 5. 2. 10:36

문제는 아래 링크 참고

https://school.programmers.co.kr/learn/courses/30/lessons/81302

 

프로그래머스

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

programmers.co.kr

접근 방식

맨해튼 거리 : (r1, c1), (r2, c2)에 위치한 테이블의 맨해튼 거리는 |r1-r2| + |c1-c2|

P : 응시자

O : 빈 테이블

X : 파티션

거리두기 : 응시자 사이에 파티션이 있거나, 맨해튼 거리가 3이상이여야 함

거리두기를 지킬경우 1, 아니면 0을 배열에 담아 반환

 

메인 함수

1. 입력받은 places의 원소(1차원 배열)하나씩 거리두기 함수에 넘김

2. 거리두기 함수는 1(지킨 경우)혹은 0(안 지킨 경우)을 반환

3. 반환 값을 answer에 append

 

거리두기 함수

1. 입력받은 place에서 P를 검색

2. 검색한 P의 상,하,좌,우 방향의 P혹은 O를 검색

2-1. P를 찾으면 0을 반환

2-2. O를 찾았다면 다시 한 번 상,하,좌,우 중 온 방향을 제외한 곳의 방향의 P를 검색

2-3. P를 찾으면 0을 반환

3. 위 과정을 모두 통과하면 1반환

 

풀이코드

def keep_distance(place):
    directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]

    for x in range(5):
        for y in range(5):
            
            if place[x][y] == 'P':
                # 바로 옆칸 검사
                for dx, dy in directions:
                    nx, ny = x + dx, y + dy
                    
                    if 0 <= nx < 5 and 0 <= ny < 5:
                        if place[nx][ny] == 'P':  # 바로 옆에 사람이 있는 경우
                            return 0
                        
                        elif place[nx][ny] == 'O':  # 빈 테이블이면 다음 칸도 검사
                            new_directions = [direction for direction in directions if direction != (-dx, -dy)]
                            
                            for ddx, ddy in new_directions:
                                nnx, nny = nx + ddx, ny + ddy
                                
                                if 0 <= nnx < 5 and 0 <= nny < 5:
                                    if place[nnx][nny] == "P":
                                        return 0
            
    #모두 통과시
    return 1

def solution(places):
    answer = []
    
    for place in places:
        answer.append(keep_distance(place))
        
    return answer

 

주의사항

- 처음에 P를 찾고 상하좌우 검색해서 O를 찾았을 때 다음 방향 검색 시 내가 온 방향은 제외하고 검사해야함