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();
}
'백준 > 삼성기출문제' 카테고리의 다른 글
백준 15686 c++ "치킨 배달" -PlusUltraCode- (0) | 2024.10.08 |
---|---|
백준 14500 c++ "테트로미노" -PlusUltraCode- (1) | 2024.10.05 |
백준 c++ 14890 "경사로" -PlusUltraCode- (0) | 2024.07.02 |
백준 c++ 23288 "주사위 굴리기2" -PlusUltraCode- (0) | 2024.06.28 |
백준 17144 c++ "미세먼지 안녕!" -PlusUltraCode- (0) | 2024.06.26 |