티스토리 뷰
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
링크
TAG
- OOP
- JdbcTemplate
- 객체지향
- java
- 상속
- JDBC 프로그램 작성단계
- INSERT
- 객체
- Update
- view
- controller
- ojdbc6.jar
- 추상화
- model
- Scott/Tiger
- jdbc
- 다형성
- Delete
- Oracle
- select
- .
- java 환경설정
- 캡슐화
- MVC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함