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 역량테스트 준비 - 백준 알고리즘 문제
'Data Structures, Algorithm > SW 역량테스트' 카테고리의 다른 글
SW 역량테스트 - [백준] 어른 상어 문제 풀이/해답/코드 (C++ / JAVA) (2) | 2020.10.16 |
---|---|
SW 역량테스트 - [백준] 청소년 상어 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.16 |
SW 역량테스트 - [백준] 주사위 윷놀이 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 원판 돌리기 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 새로운 게임 2 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
Comments