SW Expert Academy - [모의 SW 역량테스트] 디저트 카페
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

SW Expert Academy - [모의 SW 역량테스트] 디저트 카페

by KyeongMin 2019. 11. 26.
728x90
반응형
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define NS 21
int N;
int input[NS][NS];
int cnt;
int ret = 0x80000000;
int dy[] = { -1,1,1,-1};
int dx[] = { -1,-1,1,1};
bool safe(int y, int x) {
	if (0 <= y && y < N && 0 <= x && x < N) return true;
	else return false;
}
bool chk(int rotY,int rotX,int sy,int sx) {
	int numFood[101] = { 0, };// 음식 중복체크
	cnt = 0;//먹은 디저트수
	int y = sy; int x = sx;
	for (int dir = 0; dir < 4; dir++) {
		if (dir == 0 || dir == 2) {
			for (int i = 0; i < rotY; i++) {
				y += dy[dir]; x += dx[dir];
				if(safe(y,x)&&numFood[input[y][x]]==0){
					numFood[input[y][x]] = 1;
					cnt++;
				}
				else return false;
			}
		}
		else {
			for (int i = 0; i < rotX; i++) {
				y += dy[dir]; x += dx[dir];
				if (safe(y, x) && numFood[input[y][x]] == 0) {
					numFood[input[y][x]] = 1;
					cnt++;
				}
				else return false;
			}
		}
	}
	return true;
}
void eatFood() {
	for (int rotY = 1; rotY <= N - 1; rotY++) {
		for (int rotX = 1; rotX <= N - 1; rotX++) {
			for (int y = 0; y < N; y++) {
				for (int x = 0; x < N; x++) {
					if (chk(rotY,rotX,y,x)) {
						ret = ret < cnt ? cnt : ret;
					}
				}
			}
		}
	}
}
void init() {
	ret = 0x80000000;
	memset(input, 0, sizeof(input));
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cin >> input[i][j];
		}
	}
	eatFood();
}
int main(void) {
	int T;
	cin >> T;
	for (int tc = 1; tc <= T; tc++) {
		init();
		if (ret == 0x80000000)ret = -1;
		cout << '#' << tc << " " << ret << endl;
	}
	return 0;
}

대략적으로 간단하게 설계를 하고 함수를 나눠서 문제풀이를 진행했습니다. 이문제는 대각선으로 이동시키는 것을 완전탐색으로 했는데 최적인 방법이 아닐 수 있지만 이렇게도 풀리는것을 보인 문제입니다. 참고해주시고 

질문하실것 있으시면 질문해주세요 

728x90
반응형

댓글