본문 바로가기

백준

1193 분수찾기

으아악 너무 힘들었다. 규칙 찾는 문제인 것 같은데 이걸 어떻게 하지 하다 고등학교 때 이런 문제 푼 것 같아서 그냥 그 기억 그대로 풀었다. 보면 1/1 ~ 2/1 ~ 3/1 이런 덩어리로 볼 수 있으니 그 덩어리 안에서 몇 번째인지 구하면 X가 나온다. 

 

그런데 저렇게 코딩하면 이상하게 나온다? 알고보니 내가 문제를 잘 못 읽었다. 순서를 잘못 붙여서 결과가 다르게 나온다.. 허어..어.. 

다행이도 조금만 고치면 해결되는 문제였다. 

#include <iostream>

int main() {
    int x;
    scanf("%d", &x);
    
    for(int i = 1; ; i++){
        int num = 1 + i*(i-1)/2;
        if(x < num){
            int index = i - 1;
            int sub = x - num + i - 1;
            
            if((i-1)%2 == 1)
                printf("%d/%d", index-sub, 1+sub);
            else
                printf("%d/%d", 1+sub, index-sub);
            break;
        }
    }
    return 0;
}

맞췄음..

 

돌리기 전 걱정되는 부분은 시간제한이 0.5초인거! O(n)일때 대략 1억번을 돌 수 있으니 0.5초면 그 반.. 5천번 돌 수 있을 것이다 (맞나여) 다행히 입력이 1천이라 괜찮을 것 같았다. 게다가 코드를 보면 알겠지만 for문이 한 개이긴 하지만 n만큼은 안 돔.. 

 

두 번째는 int num = 1 + i*(i-1)/2; 여기서 num 터지지 않을까 싶은거. 사실 이거 다 짜고 힘들어서 그냥 돌려서 맞길래 넘어갔는데, 음.. 엄.. 모르겠다. 왜 안 터졌지. 저렴한 생각으로 치면 x < num이므로 num은 x와 비슷한 값일 것이다. 10^7 + (얼마) 겠지.. 근데 그 얼마 더해봤자 10^9까지 안 갈 것 같아서 안 터진 거 같다. 

 

 


오.. 몰랐던 거..

 

n은 i의 제곱에 비례해서 실제로 시간복잡도는 루트가 된다. 그래서 입력이 1억의 제곱은 1조 정도까지 범위로 들어와도 1초 안에 수행 가능하다!

'백준' 카테고리의 다른 글

2864 5와 6의 차이  (0) 2019.10.25
1158 조세퍼스 문제  (0) 2019.10.13
15552 빠른 A + B  (0) 2019.10.12
4673 셀프 넘버  (0) 2019.10.12
1110 더하기 사이클  (0) 2019.10.11