반응형

문제 출처 :


https://www.acmicpc.net/problem/1193



알고리즘 분석 :


문제 해결에 필요한 사항

1. 규칙 찾기

2. 일반항 구하기(계차수열)


아래 그림을 자세히 보면

1/1을 기준으로 ↘ 방향으로 보면 항상 규칙이 있다.


1 + 2n(n-1)번째에 항상 값이 존재한다.


예를들어 2/2는 1 + 2*2(1) 즉, 처음부터 시작하면 5번만에 도착할 수 있다.


이러한 방식으로 k번째 값이 무엇인지 궁금할 때


k보다 크거나 같은 값을 구해서 그 값을 기준으로 역행하면 답을 찾을 수 있다.






물론 이렇게 하면 조금 더 빠를것이다.


k보다 크거나 같고 k보다 작거나 같은 값을 구해서 그 두 값중 k가 가까운 쪽의 값을 선택하여 그 부분부터 k를 찾아간다면


좀 더 빠를것이다.



소스 코드 : 

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
65
66
67
68
69
70
71
#include <iostream>
 
using namespace std;
 
int main()
{
    int n;
    int ans;
    int bunmo = 0, bunja = 0;
    int flag = 0;
 
    cin >> n;
 
    for (int i = 1;; i++)
    {
        if (n <= + * i*(i - 1))
        {
            ans = i;
            break;
        }
    }
 
    // 분자 분모 초기화
    bunmo = ans;
    bunja = ans;
 
    // 지금부터 ans에는 
    // 현재 분수에 해당하는 번호가 들어간다
    ans = + * ans*(ans - 1);
 
    while (1)
    {
        // ans가 n을 찾아갔을 때
        if (n == ans)
            break;
 
        // 역순회해야 하니 왼쪽밑으로 먼저 돈다.
        if(flag == 0)
        {
            if (bunmo == 1)
            {    
                bunja--;
                flag = 1;
            }
            else
            {
                bunmo--;
                bunja++;
            }
        }
 
        else if (flag == 1)
        {
            if (bunja == 1)
            {
                bunmo--;
                flag = 0;
            }
            else
            {
                bunmo++;
                bunja--;
            }
        }
        ans--;
    }
    cout << bunja << "/" << bunmo;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[10448번] 유레카 이론  (0) 2016.11.02
[11051번] 이항 계수 2  (2) 2016.11.02
[1111번] IQ Test  (2) 2016.11.02
[13419번] 탕수육  (0) 2016.10.31
[13417번] 카드 문자열 (Deque 활용)  (3) 2016.10.31