대웅짱님의 블로그
[14891] 톱니바퀴 본문
문제: https://www.acmicpc.net/problem/14891
4개의 톱니바퀴와 각 톱니바퀴의 8 개의 볼록 부분의 상태가 주어진다.
그 후 쿼리가 최대 100번 까지 들어오면서
톱니바퀴의 번호와 회전 방향이 주어졌을 때
쿼리를 모두 수행한 후 톱니바퀴의 상태를 묻는 문제이다.
문제의 주제는 시뮬레이션이다.
각 쿼리 수행 후 톱니바퀴의 상태를 틀리지 않고 잘 가지고 갈 수 있으면 어렵지 않다.
문제 해결 아이디어는
쿼리가 들어왔을 때
먼저 해당 번호의 톱니바퀴를 방향에 맞게 회전 한다.
그 후 해당 번호부터 오른쪽의 톱니바퀴를 전부 회전 시켜주고
끝나면 나머지 왼쪽의 톱니바퀴를 회전하면 된다.
톱니바퀴를 회전할 때 만약 극이 같아 회전하지 않았다면
그 쪽 방향은 더 이상 진행하지 않아도 된다.
회전하지 않은 톱니바퀴가 있으면 그 이후의 톱니바퀴도 회전하지 않기 때문이다.
회전 방향은 입력받은 회전 방향부터
한 톱니바퀴마다 반대 방향으로 회전시켜주면 된다.
예를 들어 1번 톱니바퀴를 시계방향 회전이 입력이었을 때
모든 톱니바퀴의 맞닿는 부분이 반대 극이여서 전부 회전해야 한다면
1 - 시계, 2 - 반 시계, 3 - 시계, 4 - 반 시계 방향으로 회전하면 된다.
그리고 톱니바퀴의 상태가 붙어서 입력되는데
만약 한 숫자씩 입력받고 싶다면
1 2 3 4 5 | for(int i=0; i<4; i++){ for(int j=0; j<8; j++){ scanf("%1d", &gear[i][j]); } } | cs |
이런식으로 scanf 안에 "%1d"를 입력하면 한 숫자씩 받아올 수 있다.
문자열의 경우도 마찬가지로 "%1c"를 입력하면 한 글자씩 받아온다.
나중에 입력 때문에 골치아픈 경우도 있으니 알아두면 써둘 곳이 있을 것이다.
끝.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int gear[4][8], rotation[4], temp[8]; int function(int n, int d){ memcpy(temp, gear[n], sizeof(gear[n])); if(d==1){ for(int i=1; i<8; i++){ gear[n][i] = temp[i-1]; } gear[n][0] = temp[7]; }else{ for(int i=1; i<8; i++){ gear[n][i-1] = temp[i]; } gear[n][7] = temp[0]; } } int main(){ for(int i=0; i<4; i++){ for(int j=0; j<8; j++){ scanf("%1d", &gear[i][j]); } } int k; scanf("%d", &k); for(int i=0; i<k; i++){ int n, d, td; scanf("%d %d", &n, &d); n--; memset(rotation, 0, sizeof(rotation)); if(gear[0][2] != gear[1][6]) rotation[1]=1; if(gear[1][2] != gear[2][6]) rotation[2]=1; if(gear[2][2] != gear[3][6]) rotation[3]=1; //나 function(n, d); td = d; //오른쪽 for(int i=n+1; i<4; i++){ if(!rotation[i]) break; td *= -1; function(i, td); } //왼쪽 td = d; for(int i=n-1; i>=0; i--){ if(!rotation[i+1]) break; td *= -1; function(i, td); } } int res, t; res = 0; t = 1; for(int i=0; i<4; i++){ res += (gear[i][0] * t); t <<= 1; } printf("%d\n", res); return 0; } | cs |
'알고리즘 > BOJ' 카테고리의 다른 글
[15683] 감시 (0) | 2019.03.06 |
---|---|
[2473] 세 용액 (0) | 2019.03.05 |
[14890] 경사로 (0) | 2019.02.19 |
[14889] 스타트와 링크 (0) | 2019.02.19 |
[14888] 연산자 끼워넣기 (0) | 2019.02.19 |