Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 26008
- dart
- 브루트포스
- 15662
- 삼성
- 재귀
- 1로만들기2
- 그리디
- 회전하는큐
- spring boot
- 14863
- 서울에서경산까지
- 동적프로그래밍
- Crossfit
- 백준
- 1781
- C++
- Flutter
- 해시해킹
- DP
- 재귀함수
- BOJ
- 15353
- 4811
- BOJ14889
- D1
- 스택
- 크로스핏
- sw expert academy
- Python
Archives
- Today
- Total
곧죽어도 콛잉
[구현 / BOJ 15662 / C++] 톱니바퀴 (2) 본문
https://www.acmicpc.net/problem/15662
15662번: 톱니바퀴 (2)
총 8개의 톱니를 가지고 있는 톱니바퀴 T개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
1) 톱니를 배열로 표현한다
2) 각 톱니의 [2], [6]을 비교한다.
3) rotate를 결정한다.
정돈되지 않은 코드로 .... ㅋㅋㅋㅋ 그냥 머리속에 떠오른대로 막 해봤다.
일단 톱니모양은 어떻게 짜야할까 고민하다가
딱 보니깐 패턴이 있었다. 그냥 배열 그대로 사용하는 것!! 일단은 그림을 그려보자
그림을 보면 간단하다! 톱니의 회전 유무는 바로 배열의 2번째, 6번째 값이 결정한다!!
이게 다르면 회전! 같으면 그대로! 규칙을 쓰면 된다.
간단하지 않는가?! 이러고 두 값만 비교하고, rotate 함수를 사용하면 해결!!
나머진 재귀적으로 해결하면 된다.
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> v(1000);
int T, K;
int num, dir, tmp;
bool chk_rot[1000]; // 회전한지안한지 확인.
void go(int n, int d){ // n번째 톱니를 d방향으로 회전시킴.
if(v[n].empty()) return; // 없는 톱니면 종료.
chk_rot[n]=1; // 회전했는지 체크.
// 톱니배열의 [2](3시방향)는 다음의 [6] 와
// [6](9시방향)은 이전의 [2] 서로 비교해야함.
// 첫번째 톱니라면
if(n==0){
if(v[n][2] != v[n+1][6] && chk_rot[n+1]==0){
// 다른 극이고, n+1번째 톱니가 회전하지 않았다면
go(n+1, -d); // 반대방향으로 회전시키기.
};
}
else if(n==T-1){ // 마지막 톱니라면
if(v[n][6] != v[n-1][2] && chk_rot[n-1]==0){
// 다른 극이고, n-1번째 톱니가 회전하지 않았다면
go(n-1, -d); // 반대방향으로 회전시키기.
};
}
else { // 첫번째와 마지막 톱니가 아니라면
if(v[n][2] != v[n+1][6] && chk_rot[n+1]==0){
// 다른 극이고, n+1번째 톱니가 회전하지 않았다면
go(n+1, -d); // 반대방향으로 회전시키기.
};
if(v[n][6] != v[n-1][2] && chk_rot[n-1]==0){
// 다른 극이고, n-1번째 톱니가 회전하지 않았다면
go(n-1, -d); // 반대방향으로 회전시키기.
};
}
if(d==1){ // 시계방향.
rotate(v[n].rbegin(), v[n].rbegin()+1, v[n].rend());
// 톱니 회전시키기. 시계방향
}else if(d==-1){ // 반시계방향
rotate(v[n].begin(), v[n].begin()+1, v[n].end());
// 톱니 회전 반시계방향
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> T;
for(int i = 0 ; i < T ; i++){
string s;
cin >> s;
for(int j = 0 ; j < 8 ; j++){
tmp = s[j]-'0';
v[i].push_back(tmp);
}
}
cin >> K;
for(int i=0 ; i < K ; i++){
cin >> num >> dir;
go(num-1, dir);
memset(chk_rot, 0, sizeof(chk_rot));
}
int res = 0;
for(int i=0; i < T ; i++){
if(v[i][0]) res++;
}
cout << res <<'\n';
}
'Coding Test > C++' 카테고리의 다른 글
[구현 / BOJ 15683 / C++] 감시 (0) | 2023.07.11 |
---|---|
[구현 / BOJ 16236 / C++] 아기상어 (0) | 2023.07.11 |
[구현 / BOJ 14888 / C++] 연산자 끼워넣기 (0) | 2023.06.28 |
[구현 / BOJ 14889 / C++] 스타트와 링크 (0) | 2023.06.16 |
[그리디 / BOJ 1781 / C++] 컵라면 (0) | 2023.05.18 |
Comments