본문 바로가기
프로그래머스/lv.2

거리두기 확인하기

by bingual 2024. 3. 19.
반응형

 

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

 

프로그래머스

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

programmers.co.kr

문제풀이

 

  • solution 함수에서 현재 place의 P를 찾는다. 해당지점은 r1, c1의 되며 해당 지점 위치를 기준으로 다음 지점을 찾는다. 이때 P의 위치는 r2, c2가 된다. 
  • is_valid 함수에서 지점 A의 행부터 시작하여 해당 지점을 제외한 모든 열을 탐색한다. 이때 x 이전의 행렬들은 미리 확인한 영역이므로 계산하지 않는다.
  • is_valid 함수에서 |r1 - r2| + |c1 - c2| 에 대한 두 개의 지점에 맨해튼 거리를 구해주며 2 이하 일 때의 조건 처리를 진행해 준다. 두 개의 지점을 기준으로 탐색하며 해당 지점을 제외한 행렬에 테이블 즉 "O"가 존재한다면 거리 두기에 해당하지 않는다. 
def solution(places):
    n = len(places[0])
    answer = [1] * n
    for idx, place in enumerate(places):
        out = False
        for i in range(n):
            for j in range(n):
                if place[i][j] == "P":
                    if not is_valid(place, (n, i, j)):
                        answer[idx] = 0
                        out = True
                        break
            if out:
                break
    return answer


def is_valid(place, point):
    n, x, y = point
    for i in range(x, n):
        for j in range(n):
            if x == i and y == j:
                continue
            if place[i][j] == "P":
                dist = abs(x - i) + abs(y - j)
                if dist < 2:
                    return False
                if dist == 2:
                    for k in range(min(x, i), max(x, i) + 1):
                        for l in range(min(y, j), max(y, j) + 1):
                            if x == k and y == l or i == k and j == l:
                                continue
                            if place[k][l] == "O":
                                return False
    return True

'프로그래머스 > lv.2' 카테고리의 다른 글

의상  (0) 2024.03.20
쿼드압축 후 개수 세기  (0) 2024.03.20
행렬 테두리 회전하기  (2) 2024.03.18
배달  (0) 2024.03.16
수식 최대화  (0) 2024.03.16