Skip to content

Conversation

@Mingguriguri
Copy link
Collaborator

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 사실 이번 주에 많이 놀다보니 아무것도 하기 싫어져서 노트북과 거리두기를 했다.. 그러다보니 코테 문제 풀이하는 것에도 해이해지게 되었다.
  • 앞으로 있을 8월동안에는 꼭 챌린지 달성할 수 있도록 꾸준히 문제 푸는 것이 목표다.

🚀주간 목표 문제 수: 3개

푼 문제


프로그래머스 #81302. 거리두기 확인하기 : 그래프 / Level 2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  • 모든 좌표를 순회하며, P가 있는 위치에서만 탐색을 시작한다.
  • P에서 12개의 방향(맨해튼 거리 ≤ 2)을 조사한다:
    • 직선 거리 1
    • 직선 거리 2
    • 대각선 거리 2
  • 상대 좌표에 또 다른 P가 있다면 거리두기 위반인지 판단한다.
    • 거리 1: 바로 위반
    • 거리 2: 중간에 파티션이 있는지 확인
  • 조건에 어긋나는 경우가 있으면 즉시 0을 반환
  • 모두 문제없는 경우 1 반환

🚩제출한 코드

def solution(places):
    def is_safe(place):
        for i in range(5):
            for j in range(5):
                if place[i][j] != 'P':
                    continue

                for dx, dy in dirs:
                    ni, nj = i + dx, j + dy
                    if not (0 <= ni < 5 and 0 <= nj < 5):
                        continue
                    if place[ni][nj] != 'P':
                        continue

                    dist = abs(dx) + abs(dy)
                    if dist == 1:
                        return 0  # 거리 1에서 바로 P면 위반
                    elif dist == 2:
                        # 파티션 여부 확인
                        if dx == 0:  # 수평
                            if place[i][j + dy // 2] != 'X':
                                return 0
                        elif dy == 0:  # 수직
                            if place[i + dx // 2][j] != 'X':
                                return 0
                        else:  # 대각선
                            if place[i][nj] != 'X' or place[ni][j] != 'X':
                                return 0
        return 1
    
    dirs = [
        (-1, 0), (1, 0), (0, -1), (0, 1),  # 거리 1
        (-2, 0), (2, 0), (0, -2), (0, 2),  # 일직선 거리 2
        (-1, -1), (-1, 1), (1, -1), (1, 1)  # 대각선 거리 2
    ]
    
    answer = []
    for place in places:
        answer.append(is_safe(place))
        
    return answer

💡TIL

배운 점이 있다면 입력해주세요

  • 이 문제를 처음 보았을 때는 BFS가 가장 적합하다고 생각했다. 하지만 아이디어가 빠르게 떠오르지 않아 먼저 완전 탐색 방식으로 접근했다. 다행히 5x5 고정 크기라 완전 탐색으로도 무리가 없었다.
  • 향후 더 큰 문제로 확장되었을 때를 대비해 BFS 방식도 함께 익혀두면 좋을 것 같다.

백준 #2468. 안전 영역: 그래프 / 실버1

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  • max_height를 구한다.
  • height0부터 max_height까지 1씩 증가시키며 다음을 반복한다:
    • 방문 배열 visited를 초기화한다.
    • 모든 좌표(i, j)를 순회하면서:
      • 아직 방문하지 않았고 height보다 값이 큰 영역(visited[i][j] == False이고 map[i][j] > height)이면 DFS를 수행한다.
      • DFS 탐색을 한 번 마치면 하나의 안전 영역이므로 count += 1 해준다.
    • 안전 영역의 최대 개수를 저장하는 answer의 값을 갱신한다. (answer = max(answer, count))

🚩제출한 코드

import sys
sys.setrecursionlimit(100000)

input = sys.stdin.readline


directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]
def dfs(x, y):
    visited[x][y] = True
    for dx, dy in directions:
        nx, ny = x + dx, y + dy
        if 0 <= nx < N and 0 <= ny < N and \
                not visited[nx][ny] and map[nx][ny] > h:
            dfs(nx, ny)


N = int(input())
map = [list(map(int, input().split())) for _ in range(N)]
max_height = 0

# 맵 내의 최대값 구하기
for m in map:
    max_height = max(max_height, max(m))

answer = 0

for h in range(0, max_height + 1): # 물이 잠기지 않는 상황을 고려하여 0부터 시작한다.
    visited = [[False for _ in range(N)] for _ in range(N)]
    count = 0

    for i in range(N):
        for j in range(N):
            if not visited[i][j] and map[i][j] > h:
                dfs(i, j)
                count += 1

    answer = max(answer, count)

print(answer)

💡TIL

배운 점이 있다면 입력해주세요

Copy link
Member

@YoonYn9915 YoonYn9915 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안전구역문제 dfs로 푸셨군요 로직이 크게 어려운 문제는 아니라서 저도 dfs로 다시 풀어봐도 될 거 같아요!

저도 지난 한 주 계속 쉬었는데... 프로젝트도 끝났으니 이젠 열심히 해야 할 거 같아요

@Mingguriguri Mingguriguri merged commit 7eea0a5 into main Aug 16, 2025
@github-actions
Copy link

🔥2025-08 챌린지 진행 상황

👉 그리디

  • YoonYn9915: 1개 ❌

👉 구현

  • YoonYn9915: 0개 ❌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants