티스토리 뷰

반응형

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

 

20058번: 마법사 상어와 파이어스톰

마법사 상어는 파이어볼과 토네이도를 조합해 파이어스톰을 시전할 수 있다. 오늘은 파이어스톰을 크기가 2N × 2N인 격자로 나누어진 얼음판에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c

www.acmicpc.net

난이도 : 골드 4

 

맵을 나눠 90도로 회전하는 것이 헷갈렸습니다. 종이에 적어가며 푸니 쉽게 이해가 됐네요.

정답을 구할 때 dfs를 이용하여 칸 수를 세주며 총얼음의 양을 구했습니다.


전역 변수

int n = 맵 크기의 지수(2^n)

int size = 맵 크기

int map[][] = 문제에서 주어진 값

int dx[], dy[] = 좌표를 이동하기 위한 배열

int sum = 총 얼음의 양

 

메소드

void main

입력을 받고 명령어에 적절히 동작합니다.

동작이 끝나면 얼음의 양, 칸 수를 세줍니다.

(rotate, melt, answer 호출)

 

void rotate

명령어의 숫자 크기만큼의 배열을 시계 방향으로 90도 돌려줍니다. 현재 배열에서 돌렸을 때의 값을 next배열에 저장했습니다. 회전이 끝났을 때 map은 next를 참조하도록 했습니다.

저 한 줄을 작성하는데 꽤 오랜 시간이 걸렸네요.

 

void melt

3면 이상이 얼음이 아닌 칸을 녹입니다. 이때 동시에 얼음이 녹으므로 적절한 처리를 해주지 않을 시 한 칸이 녹아야 하는데 모든 칸이 녹을 수 있는 대참사가 벌어질 수 있습니다. 

저는 오동작 방지를 위해 큐를 이용했습니다.

 

boolean check

파라미터로 받은 좌표값들이 정상 범위인지 확인합니다.

 

int answer

연결된 얼음들을 찾습니다. 연결된 얼음들의 칸 수를 세고 반환합니다.

얼음의 칸을 세며 총얼음의 양을 구하기 위해 sum에 더해줍니다.

(check 호출)

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함