Algorithm

백준 - 21611번(마법사 상어와 블리자드) / C++

wizi 2021. 5. 11. 10:33

www.acmicpc.net/problem/21611

 

21611번: 마법사 상어와 블리자드

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그, 비바라기 마법을 할 수 있다. 오늘 새로 배운 마법은 블리자드이고, 크기가 N×N인 격자에서 연습하려고 한다. N은 항상 홀수이고, (

www.acmicpc.net

2021 삼성 인턴 기출문제였다고 합니다.

어렵다는 말이 많아서 한번 풀어봤더니 64%에서 런타임 에러가 났습니다;;

원인을 분석해본 결과

3 1

1  1  1

1  0 1

1  1  1

3 1

과 같은 테케를 넣었을 경우 모든 구슬이 사라지는 경우가 발생하는데

큐를 사용하여 구현했던 저는 여기서 터졌습니다.

아무것도 없는 큐에서 값을 pop하려 하니 런타임 에러가 발생한 것이었고 

이를 고쳐주니 문제를 맞출 수 있었습니다.

 

문제풀이 : 

문제에서 (n/2, n/2) 으로부터 회전 회오리를 돌면서 좌표를 찍어나가야합니다.

회전 회오리를 돌때 규칙을 보면 왼쪽 1칸, 아래 1칸, 오른쪽 2칸, 위쪽 2칸 ... 이런식으로

1 <= n < 7까지 각 방향을 2번씩 순회하는데 맨 마지막에만 3번을 순회한다.

이거를 반복분을 통해 작성하였고 이 틀을 통해 나머지 함수들을 작성하였다.

 

각 함수를 설명하자면

marble_move() : 빈칸을 매꿔주는 함수이다.

boom() : 구슬을 터트리는 함수이고 더이상 터트릴 구슬이 없으면 return false 이다.

make_new() : 남아있는 구슬을 통해 새로운 구슬을 만들어주는 함수이다.

skill() : 상어자식이 스킬을 쓰는 함수이다.

 

저는 queue를 이용해서 구현을 했습니다.

위에서도 써놨듯이 queue를 이용할 경우 비어있을 때 빼내는 경우가 있는지 없는지 판단을 잘해야합니다.

 

회전 회오리 하는 좌표를 pair<int,int> w[250] 라는 배열에 담아서 하면 더 구현하기 쉽지 않을까

생각이 드는데 나중에 다시 한번 풀어봐야 겠습니다. 

 

 

코드 :