본문 바로가기

알고리즘/BOJ

1614번

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


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

1398번  (0) 2018.01.14
3980번  (0) 2018.01.14
1527번  (0) 2018.01.13
9625번  (0) 2018.01.12
8320번  (0) 2018.01.12