Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

자이의 프로그래밍

tetris 본문

Algorithm/Cases-BOJ

tetris

Xi_kor 2020. 6. 20. 14:34

문제

 

테트리스를 해본 사람이라면 작대기 모양 테트리미노가 나오길 간절히 기다렸던 적이 있을 것이다. 지금 윤성이가 그러하다. 기다리고 기다리던 작대기 모양 테트리미노가 드디어 나온 것이다.

테트리스 맵은 가로로 C, 세로로 R칸의 C×R격자형 모양이다. 예를 들어보자. 아래 그림은 가로가 6, 세로가 6칸인 테트리스 맵의 상태이다.

(검정색 칸은 이미 메워져있던 칸이고, 회색칸은 이번에 메울 작대기 모양 테트리미노를 의미한다.)

이때 가로가 1칸이고 세로가 4칸인 1×4 직사가형 작대기 모양의 테트리미노(테트리미노는 항상 1×4)를 왼쪽에서 5번째 칸에 둘 경우 총 세줄의 수평선을 메울 수 있다. 테트리스는 한번에 여러 수평선을 메울수록 큰 점수를 얻는 게임이므로, 위 경우에서는 이 방법이 가장 높은 점수를 얻을 수 있는 방법이다.

윤성이를 도와 작대기 모양 테트리미노를 어디에 두었을 때 가장 높은 점수를 얻을 수 있는지 알려주자. (윤성이는 작대기 모양 테트리미노가 나왔을때 게임오버를 당할지언정 가로가 더 길도록 눕혀서 두지 않는다는 나름의 테트리스 철학이 있다.)

그리고 테트리스는 무조건 일자로 떨어진다. (오른쪽에서 왼쪽으로 공간을 비집고 들어가는 등의 스킬은 윤성이에겐 존재하지않는다.)

 

입력

첫 줄에는 격자 크기를 나타내는 정수 C R이 하나의 공백을 사이에 두고 차례대로 주어진다. 두 값의 범위는 5 ≤ C, R ≤ 20이다. 그다음 줄 부터 총 R줄에 걸쳐 맵의 상태를 나타내는 숫자들이 공백을 사이에 두고 주어진다. 0은 아직 채워지지 않은 칸을 나타내며 1은 채워져있는 칸을 나타낸다.

 

출력

작대기를 왼쪽에서 X번째 자리에 두었을 때 가장 높은 점수를 얻을 수 있고 그 때 완전히 메워지는 수평선의 개수가 Y개라면, Y를 최대로 만드는 X와 그 때의 Y를 하나의 공백을 사이에 두고 출력해야 한다.

만약 어떤 자리에 두어도 수평선을 하나도 메울 수 없거나 게임오버가 일어나는 경우라면 X Y를 둘다 0으로 출력한다.(게임오버는 새로 내려온 작대기가 맵상을 벗어난 경우에 일어난다. 새로나온 작대기가 맵의 가장자리에 걸쳐있는 경우는 게임오버가 아니다.)

 

예제 입력

6 7

0 0 0 0 0 0

0 0 0 0 0 0

1 1 1 0 0 1

1 1 1 0 0 1

1 1 1 0 1 1

1 1 1 0 1 1

1 1 1 0 1 1

 

예제 출력

4 3

 

------------------------------------------------------------------------------------------------------------------------------

 

각 열마다 검사하면서 가장 깊은 칸 (위에서부터 조사했을 때 1을 만나기까지의 0의 갯수가 가장 많은 칸)을 고른 뒤 0으로만 된 칸이면 맨 밑에서부터 4칸을, 아니라면 위에서부터 조사했을 때 1을 만나기 전 4칸을 1로 바꿔 버린 후, 가로 줄이 전부 1인 칸의 갯수를 세서 구했다.

#include <iostream>
using namespace std;

int main() {
	int row, col;
	int Zero[25];
	int Array[25][25];
	cin >> col >> row;
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			cin >> Array[i][j];
		}
	}

	for (int i = 0; i < col; i++) {
		int num = 0;
		for (int j = 0; j < row; j++) {
			if (Array[j][i] == 1) break;
			else num += 1;
		}
		Zero[i] = num;
	}

	int setarr = 1;
	int base = Zero[0];
	for (int i = 0; i < col; i++) {
		if (Zero[i] > base) {
			base = Zero[i];
			setarr = i + 1;
		}
	}

	if (Zero[setarr - 1] == row) {
		Array[row - 1][setarr - 1] = 1;
		Array[row - 2][setarr - 1] = 1;
		Array[row - 3][setarr - 1] = 1;
		Array[row - 4][setarr - 1] = 1;
	}
	else {
		for (int i = 0; i < row; i++) {
			if (Array[i][setarr - 1] == 1) {
				Array[i - 1][setarr - 1] = 1;
				Array[i - 2][setarr - 1] = 1;
				Array[i - 3][setarr - 1] = 1;
				Array[i - 4][setarr - 1] = 1;
			}
		}

	}

	int score = 0;
	for (int i = 0; i < row; i++) {
		int status = 0;
		for (int j = 0; j < col; j++) {
			if (Array[i][j] == 0) {
				status = 1;
			}
		}
		if (status == 0) score++;
	}

	cout << setarr << " " << score;

	return 0;
}

'Algorithm > Cases-BOJ' 카테고리의 다른 글

삽입정렬의 구현  (0) 2020.06.20
버블정렬의 구현  (0) 2020.06.20
seat  (0) 2020.06.20
bingo  (0) 2020.06.03
baseball game  (0) 2020.06.01