KoreanFoodie's Study

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

Data Structures, Algorithm/SW 역량테스트

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

GoldGiver 2020. 10. 15. 23:55


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

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

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

 


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

해답 코드 : 

 

#include <iostream>

using namespace std;

typedef struct block {

	int filled;
	int right;
	int left;
	int up;
	int down;

}block;

//block green[6][4];
//block blue[6][4];
block map[2][10][4];

int inst[10000][3];
int ans;


int sum_tiles() {
	int sum = 0;

	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 4; j++) {
			if (map[0][i][j].filled == 1) {
				sum++;
			}
			if (map[1][i][j].filled == 1) {
				sum++;
			}
		}
	}

	return sum;
}

// move -> move blocks in green tiles
void move(int row, int col, block cur_b, int g_b) {

	// original position
	int o_r, o_c;
	o_r = row; 
	o_c = col;

	if (cur_b.filled == 0) return;
	if (row == 9) return;

	if (cur_b.right == 1) {
		while (row < 9 && map[g_b][row + 1][col].filled != 1 &&
			map[g_b][row + 1][col+1].filled != 1) {
			row++;
		}
		// erase
		map[g_b][o_r][o_c] = { 0, 0, 0, 0, 0 };
		map[g_b][o_r][o_c + 1] = { 0, 0, 0, 0, 0 };

		// move
		map[g_b][row][col] = {1, 1, 0, 0, 0};
		map[g_b][row][col+1] = {1, 0, 1, 0, 0};

	}
	else if (cur_b.up == 1) {
		while (row < 9 && map[g_b][row + 1][col].filled != 1) {
			row++;
		}
		// erase
		map[g_b][o_r][o_c] = { 0, 0, 0, 0, 0 };
		map[g_b][o_r - 1][o_c] = { 0, 0, 0, 0, 0 };

		// move
		map[g_b][row][col] = { 1, 0, 0, 1, 0 };
		map[g_b][row-1][col] = { 1, 0, 0, 0, 1 };

	}
	else if (cur_b.down == 1 || cur_b.left == 1) {
		return;
	}
	else {

		while (row < 9 && map[g_b][row + 1][col].filled != 1) {
			row++;
		}
		// erase
		map[g_b][o_r][o_c] = { 0, 0, 0, 0, 0 };
		
		// move
		map[g_b][row][col] = { 1, 0, 0, 0, 0 };

	}


}

// score = 1
void erase_line(int line, int g_b, int score) {

	// erase line and unlink 'up', 'down'
	if (score == 1) ans++;

	for (int j = 0; j < 4; j++) {
		map[g_b][line][j] = { 0, 0, 0, 0, 0 };
		
		if (line > 0) {
			map[g_b][line - 1][j].down = 0;
		}

		if (line < 9) {
			map[g_b][line+1][j].up = 0;
		}
	}

}

void shift(int g_b) {

	block t_b;

	for (int i = 8; i >= 0; i--) {
		for (int j = 0; j < 4; j++) {
			map[g_b][i+1][j] = map[g_b][i][j];
		}
	}

	for (int j = 0; j < 4; j++) {
		map[g_b][9][j].down = 0;
	}

}



// return line that vanishes
void check(int g_b) {

	bool again = false;

	bool erase = false;

	int max_line = 0;

	for (int i = 9; i >= 6; i--) {

		erase = true;

		for (int j = 0; j < 4; j++) {
			if (map[g_b][i][j].filled == 0) {
				erase = false;
				break;
			}
		}

		if (erase) {
			erase_line(i, g_b, 1);
			max_line = max(max_line, i);
			again = true;
		}
	
	}

	if (again) {
		for (int i = max_line; i >= 4; i--) {
			for (int j = 0; j < 4; j++) {
				move(i, j, map[g_b][i][j], g_b);
			}
		}
		check(g_b);
	}
	else {

		bool upper = false;
		bool lower = false;
		int cnt = 0;

		// check upper row (0, 1)
		for (int j = 0; j < 4; j++) {
			if (map[g_b][4][j].filled == 1) {
				upper = true;
			}
			if (map[g_b][5][j].filled == 1) { 
				lower = true;
			}
		}

		if (upper && lower) {
			cnt = 2;
		}
		else if (!upper && !lower) {
			cnt = 0;
		}
		else {
			cnt = 1;
		}

		for (int i = 0; i < cnt; i++) {
			shift(g_b);
		}
		
		/*
		if (upper || lower) {
			check(g_b);
		}
		*/
		

	}



}


// move green/blue blocks for each cycle
// line : line that starts
void cycle(int t, int x, int y) {

	int g_t, g_r, g_c;
	int b_t, b_r, b_c;
	block g_blk;
	block b_blk;

	if (t == 1) {
		g_blk = { 1, 0, 0, 0, 0 };
		b_blk = {1, 0, 0, 0, 0};
		g_t = 1; g_r = x; g_c = y;
		b_t = 1; b_r = 0; b_c = 3-x;
	}
	else if (t == 2) {
		g_blk = { 1, 1, 0, 0, 0 };
		b_blk = { 1, 0, 0, 1, 0 };
		g_t = 2; g_r = 0; g_c = y;
		b_t = 3; b_r = 1; b_c = 3-x;
	}
	else {
		g_blk = { 1, 0, 0, 1, 0 };
		b_blk = { 1, 1, 0, 0, 0 };
		g_t = 3; g_r = 1; g_c = y;
		b_t = 2; b_r = 0; b_c = 2-x;
	}

	// move blocks to green
	move(g_r, g_c, g_blk, 0);
	move(b_r, b_c, b_blk, 1);
	
	check(0);
	check(1);
}


int main() {

	int N;
	ans = 0;

	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> inst[i][0] >> inst[i][1] >> inst[i][2];
	}

	for (int i = 0; i < N; i++) {
		cycle(inst[i][0], inst[i][1], inst[i][2]);
	}

	int sum_t = sum_tiles();

	cout << ans << endl;
	cout << sum_t << endl;


}

 

 

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

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

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

 
Comments