구름톤 챌린지/week2

구름톤 챌린지 DAY7 - 구름 찾기 깃발

ITTO 2023. 8. 22. 22:41

 

문제)
한 변의 길이가 N인 게임판에서,
어떤 칸에는 구름이 그려져 있고, 우리는 구름이 그려져 있지 않은 칸에 깃발을 꽂아 주위에 구름이 몇개 있는지 나타낸다.
이때 입력값으로 받은 K와 같은 깃발이 몇개 있는지 구하라.

 

 

 

 

문제 해석)
지뢰 찾기 게임에서, 지뢰가 아닌 칸을 클릭하면 주위에 있는 지뢰의 개수를 알려주는 숫자가 나타난다.
이걸 구현하면 된다.

 

구현 방법)
1. 전체 순회 하면서 0인 칸에 대하여, 주위 칸에 1이 있으면 그걸 counting,
2. counting한 숫자를 vector에 넣어서 K값과 비교하며 숫자 세기

 

 

N, K는 받아와서 예외를 처리해준다.

 

C++에서 동적 배열은 반복문을 통해 이중 포인터로 만든다.
위와 같이 먼저 new로 할당을 해준 후에, 반복문과 cin으로 입력값을 받아온다.

 

 

깃발을 넣을 vector를 선언하고,
전체를 순회하면서 0인 값이 있으면 그때 위치 주변의 1의 개수를 구한다.

 

 

x, y(현재 위치)값을 받아와서 주변의 범위를 min max로 정해준다.
이때 배열이므로 0보다 작거나 N보다 큰 숫자들은 범위 내로 수정해준다.

주변을 보고 1인 애가 있으면 numOfOne++을 해준다.
(짤렸는데 마지막에 return numOfOne; 까지 해준다.)

 

 

그렇게 구한 깃발들을 K값과 비교하며 counting한다.

 

 

마지막으로 동적 할당 했던 것을 delete해준다.

 

 

결과는 정답!

 

 

오늘은 좀 무식한 방법으로 풀어서 그런지
꽤 쉽게 풀었다.

와중에 2차원 배열 동적 할당하는 걸 오랜만에 해서
또 까먹었다;;
사실 외우기엔 좀 버거운데 외워봐야겠다...

 

이런 동적배열에서 항상 array out of range와 같은 오류가 안뜨도록 하는게 고민이었는데,
이번에 함수로 만들면서 미리 범위를 정한 후 반복문을 돌렸던 게 좀 잘한 부분 같다.

항상 for문 중간에 if(i < 0) continue; 이런식으로 했는데,
이렇게 하는 것보다 훨씬 이해하기 쉬운 것 같다.