# 문제
# 입력 및 출력
# 풀이
처음 입력받은 게임판: 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 |
댓글