| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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
- GoormIDE
- 패러다임 불일치
- @Valid
- spring boot
- session
- springboot
- spring websocket nginx 설정
- 도메인 주도 개발
- 관점 지향 프로그래밍
- AWS
- validation
- 구글 로그인
- 자바 orm
- Flask
- presigned url
- OpenAI API
- oauth2.0
- ec2 nginx websocket reverse proxy
- logout
- 백준 10815 # 백준 Java
- 예외 처리
- jwt
- S3
- 개발 프로젝트
- 소셜 로그인
- 이미지 업로드
- 스프링부트
- wss 연결 실패
- fastapi
- CustomException
Archives
- Today
- Total
개발세발은 안되요
[C++]BJO 14891 : 톱니바퀴 본문
문제
https://www.acmicpc.net/problem/14891
풀이
문제에 설명된 그대로를 구현한다.
나는 우선 톱니바퀴의 첫 상태 입력을 arr[][] 이라는 2차원 배열로 저장했다.
이때 톱니바퀴의 정보는 띄어쓰기로 구분되지 않기 때문에 직접 변환해주어야 한다.
나의 경우 string으로 받아서 int로 변환해주었다.
ex) arr[0][0] : 1번 톱니바튀의 12시 방향 정도
이제 입력받은 돌리기 정보를 이용해 해당 돌리기를 실행했을 때 함께 돌아가는 톱니와 돌아가지 않는 톱니를 먼저 구해놓고 난 후, 일괄적으로 돌려준다.
예를 들어, 3 -1 라는 돌리기 정보가 들어왔을 때
3번을 돌리고 난 후 -> 2번 돌릴지 확인하고 난 후 돌리고 -> 1번 돌릴지 확인하고 돌리기 의 방식이 아니라,
3번을 아직 돌리기 전, 3번을 돌릴 때 함께 회전할 톱니들을 구해놓고 난 후 한꺼번에 돌리기 의 방식을 취해야 한다.
즉 톱니들은 동시에 돌아가기 때문에, 어떤 하나의 톱니를 돌리고 난 후 해당 톱니 주변의 톱니를 돌릴지 말지가 결정되는 것이 아니라 모든 톱니는 함께 돌아가거나 돌아가지 않는다는 점을 기억해야 한다.
이것들을 이제 직접 구현해주면 된다.
코드
#include <iostream>
using namespace std;
int arr[4][8];
int k;
int method[100][2];
// 시계 방향 회전
// n -1 톱늬 회전
void rotate(int n){
int cur[8];
for(int i=0; i<8; i++){
cur[i] = arr[n][i];
}
for(int i=0; i<7; i++){
arr[n][i+1] = cur[i];
}
arr[n][0] = cur[7];
}
// 반대 방향 회전
void rotate_reverse(int n){
int cur [8];
for(int i=0; i<8; i++){
cur[i] = arr[n][i];
}
for(int i=7; i>=1; i--){
arr[n][i-1] = cur[i];
}
arr[n][7] = cur[0];
}
void make(int n, int dir){
n--;
// 선택된 것 기준으로 돌릴 방향, 톱늬 선택
int r[4] = {0}; // 0 이면 안 돌림, 1또는 -1은 돌리는 방향
// n 기준 왼쪽 탐색
int cur = dir;
r[n] = dir;
for(int i = n-1; i>=0; i--){
if(arr[i][2] != arr[i+1][6]){
cur*= -1 ;
r[i] = cur;
}
else{
cur = 0;
break; // 더 이상 회전 안 하면 필요 노노
}
}
cur = dir;
// n 기준 오른쪽 탐색
for(int i= n+1; i<8; i++){
if(arr[i-1][2] != arr[i][6]){
cur*= -1 ;
r[i] = cur;
}
else{
cur = 0;
break; // 더 이상 회전 안 하면 필요 노노
}
}
for(int i=0; i<4; i++){
if(r[i]== 1) rotate(i);
else if(r[i] == -1) rotate_reverse(i);
}
}
int main()
{
// 입력
for(int i=0; i<4; i++){
string s;
cin >> s;
for(int j=0; j<8; j++){
arr[i][j] = s[j] - 48;
}
}
cin >> k;
for(int i=0; i<k; i++){
cin >> method[i][0] >> method[i][1];
}
// 돌리기
for(int i=0; i<k; i++){
make(method[i][0], method[i][1]);
}
// 출력
int ans = arr[0][0]*1 + arr[1][0]*2 + arr[2][0]*4 + arr[3][0]*8;
cout << ans << "\n";
return 0;
}'알고리즘 > 백준' 카테고리의 다른 글
| [C++] BJO 1024 : 수열의 합 (0) | 2026.01.09 |
|---|---|
| [C++] BJO 17142 : 연구소 3 (0) | 2025.12.01 |
| [C++] BJO 14888 : 연산자 끼워넣기 (0) | 2025.11.28 |
| [JAVA] BJO 9466 : 텀 프로젝트 (0) | 2025.11.19 |
| [C++] 백준 2931 : 회의실 배정 (0) | 2025.09.11 |