KoreanFoodie's Study

SW 역량테스트 - [백준] 뱀 문제 풀이/해답/코드 (C++ / JAVA) 본문

Data Structures, Algorithm/SW 역량테스트

SW 역량테스트 - [백준] 뱀 문제 풀이/해답/코드 (C++ / JAVA)

GoldGiver 2020. 10. 15. 23:32


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

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

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

 


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

해답 코드 : 

 

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

using namespace std;

typedef struct turn {
	int sec;
	char dir;
}turn;

typedef struct pos {
	int row;
	int col;
}pos;


int N, K, L;
int map[101][101];

deque<turn> t_list;
deque<pos> snake;

// Up, Down, Left, Right
int dR[4] = {-1, 1, 0, 0};
int dC[4] = {0, 0, -1, 1};

int ans;

bool isRange(int i, int j) {
	if (i < 0 || i >= N || j < 0 || j >= N) return false;
	return true;
}

int change_dir(int ori_dir, char turn_dir) {
	if (ori_dir == 0) {
		if (turn_dir == 'L') return 2;
		else return 3;
	} 
	else if (ori_dir == 1) {
		if (turn_dir == 'L') return 3;
		else return 2;
	}
	else if (ori_dir == 2) {
		if (turn_dir == 'L') return 1;
		else return 0;
	}
	else {
		if (turn_dir == 'L') return 0;
		else return 1;
	}
}


void snake_game(int cnt, int dir) {


	// Move according to the rules
	pos n_pos;
	n_pos.row = snake[0].row + dR[dir];
	n_pos.col = snake[0].col + dC[dir];

	// terminator
	if (!isRange(n_pos.row, n_pos.col)) {
		ans = cnt;
		return;
	}
	for (int i = 0; i < snake.size(); i++) {
		if ((n_pos.row == snake[i].row) && (n_pos.col == snake[i].col)) {
			ans = cnt;
			return;
		}
	}

	// if there is an apple
	if (map[n_pos.row][n_pos.col] == 1) {
		map[n_pos.row][n_pos.col] = 0;
		snake.push_front(n_pos);
	} // no apple
	else {
		snake.pop_back();
		snake.push_front(n_pos);
	}

	// change direction
	int chn_dir = dir;

	if (!t_list.empty() && t_list[0].sec == cnt) {
		chn_dir = change_dir(dir, t_list[0].dir);
		t_list.pop_front();
	}

	snake_game(cnt+1, chn_dir);
}


int main() {

	cin >> N;
	cin >> K;

	int t_r, t_c;
	int t_s;
	char t_t;
	ans = 0;

	for (int i = 0; i < K; i++) {
		cin >> t_r >> t_c;
		map[t_r-1][t_c-1] = 1;
	}
	cin >> L;
	turn t_temp;
	for (int i = 0; i < L; i++) {
		cin >> t_s;
		cin >> t_t;
		t_temp = { t_s, t_t };
		t_list.push_back(t_temp);
	}

	int cnt, dir;
	pos temp = { 0, 0 };
	snake.push_back(temp);

	snake_game(1, 3);

	cout << ans << endl;

}

 

 

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

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

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

 
Comments