코딩 공부/백준

[백준] 16957 체스판 위의 공

고 온 2024. 12. 20. 20:21

16957번: 체스판 위의 공

시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 512 MB 2122 823 598 38.309%

문제

크기가 R×C인 체스판이 있고, 체스판의 각 칸에는 정수가 하나씩 적혀있다. 체스판에 적혀있는 정수는 모두 서로 다르다.

체스판의 각 칸 위에 공을 하나씩 놓는다. 이제 공은 다음과 같은 규칙에 의해서 자동으로 움직인다.

  • 인접한 8방향 (가로, 세로, 대각선)에 적힌 모든 정수가 현재 칸에 적힌 수보다 크면 이동을 멈춘다.
  • 그 외의 경우에는 가장 작은 정수가 있는 칸으로 공이 이동한다.

공의 크기는 매우 작아서, 체스판의 한 칸 위에 여러 개의 공이 있을 수 있다. 체스판의 상태가 주어진다. 공이 더 이상 움직이지 않을 때, 각 칸에 공이 몇 개 있는지 구해보자.

입력

첫째 줄에 체스판의 크기 R, C가 주어진다. 둘째 줄부터 R개의 줄에 체스판에 적혀있는 정수가 주어진다.

출력

총 R개의 줄에 걸쳐서 체스판에 적힌 정수를 출력한다.

제한

  • 1 ≤ R, C ≤ 500
  • 0 ≤ 체스판에 적힌 정수 ≤ 300,000

예제 입력 1 복사

3 3
1 3 4
5 6 7
8 9 2

예제 출력 1 복사

6 0 0
0 0 0
0 0 3

풀이 아이디어

칸마다 8방향으로 가장 작은 정수 값으로 가다보면 어느 한 지점에서 정지하게 된다.

각 칸마다 정지하게 지점을 찾아서 카운트 +1해주면 된다.

 

칸마다 dfs를 해버리면 모든 칸 O(n^2) * dps O(n^2) 으로 O(n^4)가 되기 때문에 브루트 포스는 지양하며

 

각칸의 정수 값 변화가 없기 때문에 칸마다 단 한번만 계산하고 이미 방문한 칸이라면

DP를 통해서 값을 리턴하는 식으로 풀면 된다.

 

시행 착오

초반에 8방향을 4방향으로 착각하고 푼 것 의외에는

많이 본 유형이라서 한번의 트라이로 풀렸다.

 

 

최적화 해보기

유니온 파인드를 쓴 사람들과 분들이랑 프로그램 속도가 2배 차이 나길래 

그렇게 차이나는가 했는데 입출력 단축 코드를 사용하니 다른 분들이랑 비슷하게 나왔다.

 

각 항목을 단 한번만 탐색하기 때문에 O(N^2)으로 푼셈인데

 

N^2의 데이터를 처리하는데

데이터의 크기보다 더 빠르게 풀 순 없을 것 같다.

 

 

'코딩 공부 > 백준' 카테고리의 다른 글

[백준] 1082 방 번호  (1) 2024.12.18
백준 1781) 컵라면 C++  (1) 2023.10.28