본문 바로가기
Algorithm/🏫assignment

# Spin And Slide

by yewoneeee 2022. 9. 4.

# 문제

 

# 입력 및 출력

 

# 풀이

처음 입력받은 게임판: char board[100][100]
오른쪽으로 90도 한 번 회전한 게임판: char spin[100][100]
아래쪽으로 미는 동작을 수행한 게임판의 한 컬럼: deque<char> slide

- spin 동작

오른쪽으로 90도 회전시키는 동작은 좌표를 보면 이해하기 쉽다.

위 그림처럼 회전시 좌표의 변경 규칙을 찾아보자.

spin[i][j] = board[N-j-1][i]

위와 같은 규칙이 된다.

따라서 spin은 좌표만으로 해결이 가능하다.

 

- slide 동작

queue 대신 deque를 사용한 이유는 .이 들어왔을때는 앞으로 보내고 색깔이 들어왔을 땐 뒤에다 push 해야하기 때문이다.

queue를 사용해도 되긴 하지만 queue는 한 번 전부 push해놓고 반복문을 돌리면서 아래쪽에 빈 칸이 있는지 확인을 해줘야해서 반복문을 줄이기 위해 deque를 사용했다.

 

deque를 그림으로 살펴보면 이런 식이다.

한 열을 deque에 집어넣으면서 아래쪽으로 미는 slide 동작을 수행하게 된다.

 

spin, slide 동작을 함수로 만들어놓고 이것을 M번 반복하면 된다.

한 번 spin, slide 동작을 수행하고 난 후의 결과 값은 다시 board에 넣어서 반복한다.

 

#include <iostream>
#include <fstream>
#include <deque>
using namespace std;

ifstream fin("spinslide.inp");
ofstream fout("spinslide.out");

char board[100][100];
char spin[100][100];

void spin_slide(int N, int M) {
	while (M--) {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				spin[i][j] = board[N - j - 1][i];
			}
		}
		for (int i = 0; i < N; i++) {
			deque<char> slide;
			for (int j = 0; j < N; j++) {
				char input = spin[j][i];
				if (input == '.') slide.push_front(input);
				else slide.push_back(input);
			}
			for (int j = 0; j < N; j++) {
				board[j][i] = slide.at(j);
			}
		}
	}
}

int main() {
	int T, N, M;
	fin >> T;
	for (int t = 1; t <= T; t++) {
		fin >> N >> M;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				fin >> board[i][j];
			}
		}
		spin_slide(N, M);
		fout << "Case #" << t << ":" << "\n";
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				fout << board[i][j];
			}
			fout << "\n";
		}
		fout << "\n";
	}
}

 

코드를 짤 때 반복문의 중첩이 너무 많아져서 시간 초과에 걸릴까봐 걱정됐다.

N, M의 범위가 최대 100까지라서 반복문은 최대 100^3 만큼 돈다.

이는 백만번으로 1억회가 대략 1초가 걸리기 때문에 1초의 시간 제한에는 문제 없이 돌아간다.

 

 

어려울 줄 알았는데 막상 푸니까 또 풀린다..ㅎㅎ

'Algorithm > 🏫assignment' 카테고리의 다른 글

# Interesting Gain  (0) 2022.09.11
# 계단 오르기  (0) 2022.09.09
# Test  (0) 2022.09.03
# Bowling 점수 계산하기  (0) 2022.07.09
# 교차점 계산  (0) 2022.07.04

댓글