본문 바로가기

CS/알고리즘

[TIL] 20240319 25일차

프로그래머스 안전지대

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

 

프로그래머스

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

programmers.co.kr

 

def solution(board):
    n = len(board)
    danger_zone = set()

    for row_idx in range(n):
        for col_idx in range(n):
            if board[row_idx][col_idx] == 1:
                row_start = 0 if row_idx == 0 else -1
                row_end = 0 if row_idx == n - 1 else 1
                col_start = 0 if col_idx == 0 else -1
                col_end = 0 if col_idx == n - 1 else 1
                for i in range(row_idx + row_start, row_idx + row_end + 1):
                    for j in range(col_idx + col_start, col_idx + col_end + 1):
                        danger_zone.add((i, j))

    return n ** 2 - len(danger_zone)

 

정석 풀이는 아직 보진 않았지만

위 코드대로 푸는 방식이 아니었을 거 같다.

 

내 경우에는 지뢰 설치 지역 및 위험 지역을 danger_zone 에 모은 다음

return할 때 전체 칸 수에서 빼는 방식으로 진행했다.

 

danger_zone 은 중복 문제를 해결하기 위해 set으로 정의했으며

그 외로는 지뢰 설치 지역이 꼭짓점이냐 변이냐에 따라 if문을 통해 상황을 분류하고

그에 맞춰 danger_zone에 요소를 추가하는 것이 끝이다.

 

위험 지역은 지뢰 설치 좌표를 기준으로 기본적으로 ±1 의 범위를 가진다.

예를 들어 설치 좌표가 (2, 2) 라면

(1, 1) (2, 1) (3, 1)
(1, 2)  (2, 2) (3, 2)
(1, 3) (2, 3) (3, 3)

 

좌표를 (x, y) 형태로 볼 때 x, y는 각각 ±1 의 범위를 가짐을 알 수 있다.

위의 예시를 보면 1(2-1)부터 3(2+1) 까지 이다.

 

나는 이 -1, +1을 각각

row_start, row_end

col_start, col_end

 

라는 변수로 정의하고

지뢰 설치 지역이 특수한 상황(꼭짓점, 변)이 아니라면 start는 -1, end는 1이 되도록 했다.

 

위험 지역 좌표는 range와 for문을 통해 danger_zone에 add 한다.

이후 (전체 지역 수 - 위험 지역 수)를 리턴한다. 

'CS > 알고리즘' 카테고리의 다른 글

프로그래머스 H-Index - 1  (0) 2024.07.08
[WIL] 20240311 ~ 20240315 5주차 정리  (1) 2024.03.15
[TIL] 20240315 23일차  (0) 2024.03.15
[TIL] 20240314 22일차  (0) 2024.03.14
[TIL] 20240313 21일차  (0) 2024.03.13