티스토리 뷰

반응형

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

 

20056번: 마법사 상어와 파이어볼

첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치�

www.acmicpc.net

난이도 : 골드 5

 

LinkedList 2차원 배열을 이용하여 풀었습니다. 1차원 배열만 이용해봤는데 2차원 배열은 처음으로 써봤습니다.

매 턴이 되면 불들이 이동을 할 텐데 불들이 이동할 때 동시에 이동해야 합니다. 이 부분을 적절히 처리하지 않는다면 오동작을 합니다. 

저는 새로운 배열을 만들어서 불을 하나씩 이동시킨 후 이 배열을 참조하도록 했습니다. int형으로 푼다면 기본적으로 연산은 버림이기 때문에 신경 쓸 것은 따로 없습니다.


전역 변수

int n = 문제에서 주어진 입력

LinkedList<FireBall> map [][] = 파이어볼의 상태를 저장하는 배열

int dx [], dy [] = 0~8까지 이동할 수 있는 좌표 값.

 

메소드

void main

입력을 받고 파이어볼들의 위치를 잡아줍니다. 그 후 k번 이동해줍니다.

(move 호출)

 

void move

파이어볼들이 이동합니다. 하지만 map에 있는 파이어볼들은 이동 후 next 배열에 새겨집니다. 오동작을 방지하기 위함입니다.

파이어볼들의 속력이 n보다 크다면 n으로 모듈러 하여 불필요한 반복을 방지합니다. 속력, 방향으로 다음 좌표 값을 계산합니다. 하지만 맵은 양 옆, 위아래가 이어진 구조입니다. 맵의 정상 범위를 벗어난다면 적절히 처리해줍니다.

모든 이동이 끝났다면 map 변수가 next 배열을 참조하여 새로운 map으로 갈아줍니다.

그 후 혹시나 파이어볼이 겹친 곳이 있으면 나눠줍니다.

(split 호출)

 

void split

배열에서 파이어볼이 2개 이상인 곳을 찾습니다. 그 좌표에서 질량과 속력의 합을 구하며 짝수와 홀수를 판별해줍니다. int로 계산하므로 소수점은 신경 쓸 필요가 없습니다. 정석은 Math.floor를 이용하는 것입니다.

문제에서 요구한 값을 구하고 새로운 파이어볼들을 그 좌표에 넣어줍니다.

 

long sum

맵에 있는 모든 파이어볼들의 질량을 더합니다.

int형으로도 될 것 같긴 한데 혹시 몰라 long으로 계산하여 반환했습니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함