공부/백준

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달이 지나서 이 포스팅을 보면 왜 또 저렇게 했을까 싶지 않을까?

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