공부/백준

1193번: 분수찾기(백준 C++)

상연 2020. 10. 13. 21:16

목차

    분수찾기 분류

    Bronze II

    난이도 제공: solved.ac


    시간 제한

    메모리 제한

    제출

    정답

    맞은 사람

    정답 비율

    0.5 초 (추가 시간 없음)

    256 MB

    34020

    17401

    15494

    53.293%

    문제


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

    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

    출처


    문제를 만든 사람: author6

    문제의 오타를 찾은 사람: deadlylaid

    어색한 표현을 찾은 사람: djm03178

    5달전 코드

    #include <iostream>
    using namespace std;
    
    int main(){
    	int x;
    	cin >> x;
    	int term = 1;
    	int n1, n2;
    	while(x != 0){
    		if(x > term){
    			x -= term;
    			term += 1;}
    		else
    			break;}
    	n1 = 1;
    	n2 = term;
    	for(int i=1; i < x; i++){
    		n1++;
    		n2--;}
    	
    	if(term%2)
    		cout << n2 << '/' << n1;
    	else
    		cout << n1 << '/' << n2;
    }

    5달전 작성한 코드이다.

    한 번 읽어보니, 분수가 지그재그로 되면,

    1/1 - 1개

    1/2 , 2/1 - 2개

    3/1, 2/2, 1/3 - 3개

    .

    .

    .

    이렇게 된다.

    즉, 결국 주어진 수 x는 어떤 수 n! 과 (n+1)! 사이에 존재하게 된다.

    여기서 이 n을 알게되면 x - n! 만큼 숫자를 빼고 더해주면 분수를 알게되는것.

    설명이 너무 조악하다...

    읽는 분들에 게 죄송하다

    솔직히 누가 이거 보면 뭔 소리하나 싶을 거 같다. ㅠㅠ 이것도 쓰다보면 늘어나겠지?

    솔직히 좀 잘 쓰려고 하면 풀어서 길게 쓰면 될 거같은데, 작성하는데 소모되는 시간의 압박이 상당해서 설명해 투자하기가 애매하다.

    계륵같은 존재라고 해야할까.

    아무튼 이번에 푼 코드를 보자.

    #include <iostream>
    using namespace std;
    
    int main(){
      int n;
      cin >> n;
    
      int i = 1;
        
      while(n - i > 0){
        n -= i;
        i++;}
    
      if(i%2)
        cout << i - (n - 1) << "/" << n;
      else
        cout << n << "/" << i - (n - 1);
    
    }
    

    어.. 기본 논리구조 자체는 동일하다.

    다만 2292번 벌집 문제와 동일하게, 반복문 등의 코드가 간략화 되었다.

    사실 5달전 코드만 봐도 왜 저렇게 했을까 싶은데 또 여기서 5달이 지나서 이 포스팅을 보면 왜 또 저렇게 했을까 싶지 않을까?

    같은 문제에 같은 논리를 이용해 문제를 풀어도 이렇게 다른 코드가 나온다는게 코딩의 매력인것 같다.