1614번 - 영식이의 손가락
이 문제는 규칙성을 파악해서 풀 수 있었다.
일단 손가락을 쓰는 순서가 1-2-3-4-5-4-3-2-1-2-3-4-5-4-3-2-1-.... 이런식으로 반복이 되는데
밑줄 친 부분이 반복이 일어난다. 이를 통해서 숫자를 구할 수 있다.
일단 저 8개에서 1과 5는 1번, 2,3,4는 2번이 나오게 된다.
일단 1은 0번째 다음에 나오고, 2는 1번째,7번째 다음에 나오고, 3은 2번째,6번째 다음에 나오고, 4는 3번째,5번째 다음에 나오고,
5는 4번째 다음에 나오게 된다.
이 모든 값을 plus 배열에 저장하였다.
값을 구하는 방법은
2를 3번 사용할 때는 동일부분 1번 반복하고(그러면 2를 두번 사용), 그 다음에 두번째에 있는 2의 앞의 갯수(7번째)까지 더해주면 된다.
2를 4번 사용할 때는 동일부분을 2번 반복하고(그러면 2를 네 번 사용), 그 다음에 첫번째에 있는 2의 앞의 갯수(1번째)까지 더해주면 된다.
이런식으로 문제를 풀 수 있다.
그리고 답을 아예 구할 수 없는 경우는, 1을 0번 사용할 수 있을 때 이므로, 예외로 처리해준다.
모든 값들은 int 범위를 넘어갈 수 있으니, 조심해야 한다.
(계산 과정이라고 하더라도...난 처음에 x와 y를 long long 으로 하지 않아서 오류가 발생했다.)
<정답 코드>
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 | #include<iostream> using namespace std; int main() { int plus[6][3] = { {0,0,0},{1,0,0},{2,7,1},{2,6,2},{2,5,3},{1,4,4} }; int n, m; long long ans = 0; scanf("%d%d", &n, &m); long long x = m / plus[n][0]; long long y = m % plus[n][0]; if (n == 1 && m == 0) { printf("%lld\n",ans); return 0; } if (y == 0) { ans = 8 * x + plus[n][2]; } if (y == 1) { ans = 8 * x + plus[n][1]; } printf("%lld\n", ans); return 0; } | cs |
반응형