Skip to content

Conversation

@03do-new30
Copy link
Contributor

@03do-new30 03do-new30 commented Feb 12, 2025

🧷 문제 링크

https://www.acmicpc.net/problem/11967

🧭 풀이 시간

60분 + a

👀 체감 난이도

✏️ 문제 설명

  • 한 방에서 다른 방의 불을 끄고 켤 수 있는 스위치가 존재한다.
  • 불이 켜져 있는 상, 하, 좌, 우의 인접한 방으로만 이동할 수 있다고 할 때
  • 불을 켤 수 있는 방의 최대 개수를 구한다.
  • 이때 무조건 (1, 1)방은 불이 켜져있다.

🔍 풀이 방법

  • BFS로 풀이한다.
  • 현재 칸에서 이동할 수 있는 방은 (1)상하좌우 인접하면서 (2)불이 켜져 있는 칸인데
  • 현재 칸에서 상하좌우 이동으로 먼저 도달하고 -> 추후에 불이 켜져서 이동 가능해지는 방도 있고,
  • 불이 먼저 켜지고 -> 나중에 상하좌우 이동으로 도달할 수 있는 방도 있다.
  • 해당 케이스들을 잘 구분해서 큐에 삽입해주면 된다.

⏳ 회고

  • 이런 BFS도 있구나 생각보다 잘 안풀렸다.

  • 방문 표시와 불 켜짐 표시를 따로따로 생각하자.

  • 문제에서 제시한 이동 가능한 방의 조건을 잘 생각했어야 한다.

  • 처음에는 무조건 켤 수 있는 스위치를 기반으로 탐색했다.

    • (i, j)에서 불을 켤 수 있는 방(x, y)가 (i, j)와 인접하다면 큐의 앞쪽에, 아니라면 큐의 뒤쪽에 넣는 방법으로 진행했는데
    • 큐에 넣는다는 것 자체가 다음 탐색을 해당 위치에서 진행한다는 것이므로 큐에 삽입되는 방은 도달 가능한지? 여부도 검사되어야 한다.
    • 나는 위 과정을 생략했다.
    • 첫 번째 풀이에서 틀린 원인은 결국 불을 켰다고 해서 방문 가능하다는 뜻은 아님을 간과했기 때문
    • 도움이 된 테스트 케이스
      10 3
      1 1 1 3
      1 3 8 8
      1 3 9 9
      ---------
      답: 2
      
  • (N+1)*(N+1) 크기의 배열을 만들고, 내부에 List를 저장하는 방법

    • List<Point>[][] buttons = new ArrayList[N+1][N+1];
    • 이후 배열 순회하며 List 초기화

@03do-new30 03do-new30 added success 👍 해설을 보지 않고 풀었을 때 timeout ⌚ 목표 시간보다 오래걸렸을 때 labels Feb 12, 2025
@ShinHeeEul ShinHeeEul merged commit 9d861d8 into main Feb 12, 2025
1 check passed
@03do-new30 03do-new30 changed the title [20250212] BOJ / G2 / 불켜기 / 신동윤 [20250212] BOJ / 골드2 / 불켜기 / 신동윤 Feb 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때 timeout ⌚ 목표 시간보다 오래걸렸을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants