본문 바로가기
프로그래밍/CodeUp

CodeUp[Q_2605] : 캔디팡

by 조원일 2020. 4. 3.
728x90

1. 문제

https://codeup.kr/problem.php?id=2605

 

캔디팡

최근 캔디팡이라는 스마트폰 게임이 인기를 끌고 있다. 캔디팡은 7 * 7 모양의 격자 판에 같은 색깔이 연속 3개 이상인 부분을 찾아 터치하면 터지면서 점수를 얻는 게임이다. 이때 연속된 부분은 상, 하, 좌, 우만 판단한다. 위 캔디팡 화면에서 터치하면 터지는 영역은 총 4군데 존재한다. 캔디팡 격자 정보가 주어졌을 때 터치하면 터지는 영역의 개수를 출력하는 프로그램을 작성하시오.(위 예시 참고)

codeup.kr

[출처 : 코드업(https://codeup.kr/)]

이번 문제는 우리가 알고있는 캔디팡 게임에서 점수를 얻을수 있는 영역의 개수를 계산하는 문제입니다.

재귀 함수를 사용하면 쉽게 해결할 수 있습니다.

또한 주어진 대로 7*7의 배열을 만들기 보다는 9*9로 만들어서 테두리를 구분해 주는 것이

알고리즘을 짤때 도움이 됩니다.

 

 

2. 풀이방법

STEP 1. (0,0)부터 (7,7)까지 점수를 얻을수 있는 영역인지 확인
STEP 2. 좌표가 주어지면 상,하,좌,우가 모두 같은 색인지 확인(재귀함수 사용)

 

 

3. 해답

#include <stdio.h>

int arr[9][9] = { 0, };

void candy(int x, int y, int key, int* count) {
	if (arr[x][y] == 0) return 0; // 0은 테두리를 의미
	else if (arr[x][y] != key) return 0; // 기존 색과 일치하지않으면

	arr[x][y] = -1;
	*count += 1;

	candy(x - 1, y, key, count); // 좌
	candy(x + 1, y, key, count); // 우
	candy(x, y + 1, key, count); // 상
	candy(x, y - 1, key, count); // 하
}

int main() {
	int count = 0;
	int tmp = 0;

	for (int i = 1; i < 8; i++) {
		for (int j = 1; j < 8; j++) {
			scanf("%d", &arr[i][j]);
		}
	}

	for (int i = 1; i < 8; i++) {
		for (int j = 1; j < 8; j++) {
			if (arr[i][j] != -1) {
				tmp = 0;

				candy(i, j, arr[i][j], &tmp);

				if (tmp >= 3) count++;
			}
		}
	}

	printf("%d", count);
	return 0;
}