KoreanFoodie's Study

SW 역량테스트 - [백준] 주사위 굴리기 문제 풀이/해답/코드 (C++ / JAVA) 본문

Data Structures, Algorithm/SW 역량테스트

SW 역량테스트 - [백준] 주사위 굴리기 문제 풀이/해답/코드 (C++ / JAVA)

GoldGiver 2020. 10. 15. 23:35


SW 역량 테스트 준비를 위한 핵심 문제들을 다룹니다!

해답을 보기 전에 문제를 풀어보시거나, 설계를 하고 오시는 것을 추천드립니다. 

코드에 대한 설명은 주석을 참고해 주세요 :)

 


문제 링크 : www.acmicpc.net/problem/14499

해답 코드 : 

 

#include <iostream>
#include <vector>
#include <deque>

using namespace std;

typedef struct pos {

	int row;
	int col;

} pos;

// Use this for 'dice', d1~d6 => element from the top
typedef struct dice_map {

	pos d_pos;

	int north;
	int west;
	int up;
	int east;
	int south;
	int down;

}dice_map;

// East, West, North, South
int dR[4] = {0, 0, -1, 1};
int dC[4] = {1, -1, 0, 0};

//deque<int> instruct;
vector <int> instruct;

int N, M, K;
int map[20][20];

dice_map dice;

void swap(int &a, int &b) {
	int temp;
	temp = a;
	a = b;
	b = temp;
}

bool isRange(int x, int y) {
	if (x < 0 || x >= N || y < 0 || y >= M) {
		return false;
	} return true;
}

void roll(int dir) {

	int t_n;

	// East
	if (dir == 0) {
		t_n = dice.east;
		dice.east = dice.up;
		dice.up = dice.west;
		dice.west = dice.down;
		dice.down = t_n;
	} // West
	else if (dir == 1) {
		t_n = dice.west;
		dice.west = dice.up;
		dice.up = dice.east;
		dice.east = dice.down;
		dice.down = t_n;
	} // North
	else if (dir == 2) {
		t_n = dice.north;
		dice.north = dice.up;
		dice.up = dice.south;
		dice.south = dice.down;
		dice.down = t_n;
	} // South
	else {
		t_n = dice.south;
		dice.south = dice.up;
		dice.up = dice.north;
		dice.north = dice.down;
		dice.down = t_n;
	}

}

int main() {

	int t_r, t_c;
	int t_d;

	cin >> N >> M >> t_r >> t_c >> K;

	dice.d_pos.row = t_r;
	dice.d_pos.col = t_c;

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

	for (int i = 0; i < K; i++) {
		cin >> t_d;
		instruct.push_back(t_d - 1);
	}

	int n_r, n_c, dir;

	for (int i = 0; i < K; i++) {
		dir = instruct[i];
		
		n_r = dice.d_pos.row + dR[dir];
		n_c = dice.d_pos.col + dC[dir];
		
		if (!isRange(n_r, n_c)) continue;

		// roll, and update position
		roll(dir);
		dice.d_pos = {n_r, n_c};

		if (map[n_r][n_c] == 0) {
			map[n_r][n_c] = dice.down;
		}
		else {
			dice.down = map[n_r][n_c];
			map[n_r][n_c] = 0;
		}

		cout << dice.up << endl;
	}

	return 0;
}

 

 

SW 역량테스트 준비 - [모의 SW 역량테스트] 풀이 / 코드 / 답안 (C++ / JAVA)

SW 역량테스트 준비 - C++ 코드, Java 코드

SW 역량테스트 준비 - 백준 알고리즘 문제

Comments