본문 바로가기
백준/삼성기출문제

백준 c++ 14499 "주사위 굴리기" -PlusUltraCode-

by PlusUltraCode 2024. 7. 5.

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

 

 

 

 

 

[필자 사고]

 

구현 문제이다. 

 

구현 문제풀이의 핵심은 한 함수에 여러개의 일들을 부여하는게 아닌 조각 조각 하나의 함수에는 하나의 역할을 부여해야

문제 푸는데 수월하게 접근할 수 있다. 객체지향적 접근

 

 

그러기 위해서 필자는 아래와 같이 함수들을 만들었따.

 

1. 초기 설정

주사위의 이동 방향을 나타내기 위해 dy와 dx 배열을 사용합니다. 이 배열은 각 방향(동, 서, 북, 남)으로 이동할 때의 행과 열의 변화를 저장합니다.

int dy[4] = { 0,0,-1,1 };
int dx[4] = { 1,-1,0,0 };

2. 변수 및 벡터 선언

지도 크기(N, M)와 주사위의 현재 위치(nowSero, nowGaro), 명령 수(K)를 저장할 변수를 선언합니다.

int N, M, nowSero, nowGaro, K;
vector<vector<int>> arr;
vector<int> moveTo;
vector<int> dice;

3. 범위 확인 함수

isInside 함수는 주어진 위치가 지도 내에 있는지 확인합니다.

bool isInside(int sero, int garo) {
    return sero >= 0 && sero < N && garo >= 0 && garo < M;
}

4. 주사위 상태 변경 함수

changeToDice 함수는 주사위를 이동 방향에 따라 새로운 상태로 업데이트합니다.

void changeToDice(int direction) {
    int d0 = dice[0], d1 = dice[1], d2 = dice[2], d3 = dice[3], d4 = dice[4], d5 = dice[5];

    if (direction == 0) { // 동쪽
        dice[0] = d3; dice[1] = d0; dice[3] = d5; dice[5] = d1;
    } else if (direction == 1) { // 서쪽
        dice[0] = d1; dice[1] = d5; dice[3] = d0; dice[5] = d3;
    } else if (direction == 2) { // 북쪽
        dice[0] = d4; dice[2] = d0; dice[4] = d5; dice[5] = d2;
    } else if (direction == 3) { // 남쪽
        dice[0] = d2; dice[2] = d5; dice[4] = d0; dice[5] = d4;
    }
}

5. 주사위와 지도 비교 및 업데이트 함수

compareDiceAndMap 함수는 주사위 바닥 숫자와 지도의 숫자를 비교하여 업데이트합니다.

 
void compareDiceAndMap(int nextSero, int nextGaro) {
    int nowDiceNumber = dice[0];
    int nowMapNumber = arr[nextSero][nextGaro];

    if (nowMapNumber == 0) {
        arr[nextSero][nextGaro] = nowDiceNumber;
    } else {
        dice[0] = nowMapNumber;
        arr[nextSero][nextGaro] = 0;
    }
}

 

 

[전체 코드]

#include <iostream>
#include <vector>

using namespace std;

int dy[4] = { 0,0,-1,1 };
int dx[4] = { 1,-1,0,0 };

int N, M, nowSero, nowGaro, K;

vector<vector<int>> arr;
vector<int> moveTo;
vector<int> dice;
bool isInside(int sero, int garo) {
	if (sero >= 0 && sero < N && garo >= 0 && garo < M)return true;
	return false;
}

void changeToDice(int direction) {


	int d0 = dice[0];
	int d1 = dice[1];
	int d2 = dice[2];
	int d3 = dice[3];
	int d4 = dice[4];
	int d5 = dice[5];

	// 0 밑면 1동쪽 2 북쪽 3서쪽 4남쪽 5위쪽


	if (direction == 0) {
		dice[0] = d3;
		dice[1] = d0;
		dice[3] = d5;
		dice[5] = d1;
	}
	else if (direction == 1) {
		dice[0] = d1;
		dice[1] = d5;
		dice[3] = d0;
		dice[5] = d3;
	}
	else if (direction == 2) {
		dice[0] = d4;
		dice[2] = d0;
		dice[4] = d5;
		dice[5] = d2;

	}
	else if (direction == 3) {
		dice[0] = d2;
		dice[2] = d5;
		dice[4] = d0;
		dice[5] = d4;
	}
}
void compareDiceAndMap(int nextSero, int nextGaro) {
	int nowDiceNumber = dice[0];
	int nowMapNumber = arr[nextSero][nextGaro];

	if (nowMapNumber==0) {
		arr[nextSero][nextGaro] = nowDiceNumber;
	}
	else {
		dice[0] = nowMapNumber;
		arr[nextSero][nextGaro] = 0;
	}

}


void Input() {
	cin >> N >> M >> nowSero >> nowGaro >> K;
	dice.resize(6 ,0);
	moveTo.resize(K);
	arr.resize(N);
	for (int i = 0; i < N; i++) {
		arr[i].resize(M);
	}

	for (int i = 0; i < N; i++) {
		for (int k = 0; k < M; k++) {
			cin >> arr[i][k];
		}
	}

	for (int i = 0; i < K; i++) {
		int num;
		cin >> num;
		moveTo[i] = num - 1;
	}
}

void GameStart() {
	
	for (int i = 0; i < K; i++) {
		int direction = moveTo[i];

		int nextSero = nowSero +dy[direction];
		int nextGaro = nowGaro + dx[direction];
		if (isInside(nextSero, nextGaro) == false)continue;
		changeToDice(direction);
		cout << dice[5] << '\n';
		compareDiceAndMap(nextSero, nextGaro);

		nowSero = nextSero;
		nowGaro = nextGaro;
	}

}

int main(void) {
	Input();
	GameStart();
}