티스토리 뷰

2019 하반기 공채 nhn 코딩테스트 모의시험으로 나왔던 전광판 광고 문제입니다.

시험 문제를 정확히 가지고 있지 않아 간단한 문제 설명 후 코드는 주석을 통해 설명하겠습니다.

주어진 크기 N * N 전광판 안에서 각각의 인덱스에 이름을 입력받고, 주어진 회전 수 만큼 회전해 출력하는 문제입니다.

queue를 이용해 회전시켰고 코드는 다음과 같습니다.

#include <iostream>
#include <string>
#include <queue>
#include <vector>
using namespace std;
vector<vector<string>> V_list;	//전광판 배열(2차원 STRING 배열) 전역변수 동적할당할라면 벡터가 편한것같아요~
//전광판 돌리는 함수
void turnADV(int s, int e, int turn) {
	if (e - s < 2)	//종료조건(시작~종료 길이가 2보다 짧다면 테두리가 아님으로 함수를 종료합니다.)
		return;
	queue<string> Q;
	int Tturn;
	//입력받은 회전수 turn 을 Tturn으로 변환하는 단계입니다. 
	//(여기서 Tturn은 "Q.front 를 back으로 옮기는 작업을 몇번 할 것인지" 입니다.)(참고로 Tturn을 1번진행하면 전광판은 반시계방향으로 1회전합니다)************
	//5칸의 경우       --> Tturn이 1이라면,,
	//ㄱㄱㄱㄱㄴ		-->	ㄱㄱㄱㄴㄴ
	//ㄹㅇㅇㅇㄴ		-->	ㄱㅇㅇㅇㄴ
	//ㄹㅇㅇㅇㄴ		-->	ㄹㅇㅇㅇㄴ
	//ㄹㅇㅇㅇㄴ		-->	ㄹㅇㅇㅇㄷ
	//ㄹㄷㄷㄷㄷ		-->	ㄹㄹㄷㄷㄷ
	//그림상 ㄱㄱㄱㄱ이 ((e - s) -1) 입니다. *4하면 테두리의 길이가 나옵니다.
	if (turn > 0)			//시계방향회전시
		Tturn = (4 * ((e - s) - 1)) - (turn % (4 * ((e - s) - 1)));			//테두리길이 - 필요없는회전수를 뺀 나머지 회전수
	else                    //반시계방향 회전시
		Tturn = (turn % (4 * ((e - s) - 1)))*-1;							//필요없는회전수를 뺀 나머지 회전수(이경우 음수이기 때문에 * -1)
	//queue에 넣기	그림처럼 ㄱㄴㄷㄹ4줄로 나누어서 queue에 순서대로 넣어줍니다.
	for (int i = s; i < e - 1; i++)		Q.push(V_list[s][i]);		//ㄱ
	for (int i = s; i < e - 1; i++)		Q.push(V_list[i][e - 1]);	//ㄴ
	for (int i = e - 1; i > s; i--)		Q.push(V_list[e - 1][i]);	//ㄷ
	for (int i = e - 1; i > s; i--)		Q.push(V_list[i][s]);		//ㄹ
	//Tturn만큼 Q.front를 Q.의 back부분으로(반시계 회전)
	while (Tturn-- > 0) {
		Q.push(Q.front());
		Q.pop();
	}
	//전광판에 넣기 (Q에 있는 순서대로 다시 전광판에 넣어줍니다~)
	for (int i = s; i < e - 1; i++) { V_list[s][i]	   = Q.front(); Q.pop(); }	//ㄱ
	for (int i = s; i < e - 1; i++) { V_list[i][e - 1] = Q.front(); Q.pop(); }	//ㄴ
	for (int i = e - 1; i > s; i--) { V_list[e - 1][i] = Q.front(); Q.pop(); }	//ㄷ
	for (int i = e - 1; i > s; i--) { V_list[i][s]	   = Q.front(); Q.pop(); }	//ㄹ
	//안쪽테두리 재귀호출(시작점+1, 끝점-1, 회전반대)
	//5칸의 경우       -->  재귀호출시,,
	//ㄱㄱㄱㄱㄴ		-->	ㅇㅇㅇㅇㅇ
	//ㄹㅇㅇㅇㄴ		-->	ㅇㄱㄱㄴㅇ
	//ㄹㅇㅇㅇㄴ		-->	ㅇㄹㅇㄴㅇ
	//ㄹㅇㅇㅇㄴ		-->	ㅇㄹㄷㄷㅇ
	//ㄹㄷㄷㄷㄷ		-->	ㅇㅇㅇㅇㅇ
	return turnADV(s + 1, e - 1, -turn);
}
int main() {
	int N, turn;	//전광판 크기, 회전수
	//입력
	cin >> N >> turn;
	//전광판 입력
	string str;
	for (int i = 0; i < N; i++) {
		vector<string> V;			//1차원 STRING 배열 선언해서
		for (int j = 0; j < N; j++) {
			cin >> str;				//cin도 공백구분을 합니다!
			V.push_back(str);	//입력받는것 하나씩 넣어주고
		}
		V_list.push_back(V);	//안쪽 for loop에서 입력받은 1차원배열을 2차원 배열에 한줄씩 넣어줍니다!
	}
	//돌려돌려~
	turnADV(0, N, turn);
	//정답출력
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			cout << V_list[i][j] << ' ';
		}
		cout << endl;
	}
	return 0;
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함