나의 기록, 현진록

[C] <BAEKJOON> 백준 1193번 : 분수찾기 본문

Programming/Algorithm & Data Structure

[C] <BAEKJOON> 백준 1193번 : 분수찾기

guswlsdk 2020. 11. 16. 15:21
반응형
 
 
시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
0.5 초 (추가 시간 없음) 256 MB 35321 17184 15321 52.886%

문제

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

1/1 1/2 1/3 1/4 1/5
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1

이와 같이 나열된 분수들을 1/1 -> 1/2 -> 2/1 -> 3/1 -> 2/2 -> … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.

X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

출력

첫째 줄에 분수를 출력한다.

예제 입력 1

14

예제 출력 1

2/4

 

풀이

패턴 찾기 - 1

 

행과 분자가 같이 증가하고

열과 분모가 같이 증가한다.

 

n행 1열과 1행 n열을 제외한 나머지

 

대각선으로 분자나 분모가 서로 반대로 증감한다.

 

 

 

 

패턴 찾기 - 2 

 

배열을 피라미드 형태로 기울 때

 

 

n 줄은 n개의 분수를 가진다.

 

 

 

또한 n이 짝수일 경우 분자에 n

n이 홀수일 경우 분모에 n을 가진 분수로 시작하는 순서를 가진다.

 

 

 

풀이 -1

 

 

구해야 하는 값은 크게 2가지

1. 입력값의 n줄

2. n줄의 i번 째 분수인지

 

 

 

1번

줄은 n으로 하고 n은 0부터 시작한다

sum에 n을 더하는 과정이다.

 

입력값의 분수가 n줄이라는 것을  확인하기 위해서

n+1줄이 아니라는 것을 확인하는 과정을 추가했다.

 

 

 

 

2번

i=input-sum

n줄에서 입력값의 분수의 순서는 i이다

 

그러나 반복문은 i-1 만큼 실행해야 하기 때문에

i=input-sum-1 

 

 

 

 

 

 

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
#include <stdio.h>
int main(){
        int n=0//input의 분수가 존재하는 n
        int sum=0;
        int input;
 
        scanf("%d",&input);
 
        while(1){
                sum+=n;
                if(sum+n+1>=input) break;
                n++;
        }
 
        int i=input-sum-1//반복문 조건
        int up;
        int down;
 
        if(n%2==0){
                up=1;
                down=n;
 
                for(int j=0; j<i; j++){
                        up++;
                        down--;
                }
        }
        else{
                up=n;
                down=1;
 
                for(int j=0; j<i; j++){
                        up--;
                        down++;
                }
        }
        printf("%d/%d\n",up,down);
 
        return 0;
}
cs

 

 

 

 

 

 

풀이-2

 

i는 줄 수

 

x는 입력값으로 사용할 수 있고

나중에 i번 째에 있는 분수의 자리 수를 나타낸다

 

x는 분수가 몇번 째 있는지 나타내지만 실제 반복 횟수는 x-1이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main(){
        int x;
        int i=1;
        scanf("%d"&x);
        while(1){
                if(x-i<=0break;
                x-=i++;
        }
        int up;
        int down;
        if(i%2==0){
                up=1+(x-1);
                down=i-(x-1);
        }
        else{
                up=i-(x-1);
                down=1+(x-1);
        }
        printf("%d/%d",up,down);
        return 0;
}
cs
반응형