백준/단계별

[C++] 백준 1193

loasd 2022. 12. 22. 00:00
반응형

백준의 1193번 문제 분수찾기 이다.

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

 

1193번: 분수찾기

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

www.acmicpc.net


 < 문제 >

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

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번째 분수를 구하는 프로그램을 작성하시오.

 

 < 예제 >

슬슬 문제가 어려워지기 시작한다.

먼저 분수를 읽는 순서를 간단히 그림으로 나타내자면

이렇게 빨간색에서는 위에서 아래로, 파란색에서는 아래에서 위로 읽는다.

그러니까 순서가

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

이렇게 된다.

 

전체 코드를 보면 이렇다.

#include <iostream>
#include <string>
using namespace std;

int main() {

	int num;
	cin >> num;

	if (num == 1)
		cout << 1 << '/' << 1 << endl;
	else {
		int i = 1;
		while (num > i) {
			num -= i;
			i++;
		}
		if (i % 2 == 1)
			cout << i + 1 - num << '/' << num << endl;
		else
			cout << num << '/' << i + 1 - num << endl;
	}
}

먼저 입력받은 숫자가 1인 경우에는 1/1을 출력하게 하고 그 외의 경우를 정해준다.

 

		int i = 1;
		while (num > i) {
			num -= i;
			i++;
		}

while문을 통해 숫자가 몇번째 대각선에 위치해 있는지 확인한다.

num에 10이라는 값이 나온다면 while문은 조건식이 참일경우에 계속 반복하므로 

1) num -= i -> num = 10-1 = 9  / i++ -> i = 2    == 9 > 2

2) num -= i -> num = 9 - 2 = 7  / i++ -> i = 3    == 7 > 3

3) num -= i -> num = 7 - 3 = 4  / i++ -> i = 4    == 4 > 4

여기서 num > i의 조건에 만족하지 않기 때문에 num(10)은 i = 4, 4번째 대각선에 포함되는 것이다.

 

		if (i % 2 == 1)
			cout << i + 1 - num << '/' << num << endl;
		else
			cout << num << '/' << i + 1 - num << endl;

 

그리고 얻은 i값을 통해 위치에 어떤 분수가 들어갔는지 확인해주면 된다.

 

반응형

'백준 > 단계별' 카테고리의 다른 글

[C++] 백준 10250  (0) 2022.12.22
[C++] 백준 2869  (0) 2022.12.22
[C++] 백준 2292  (1) 2022.12.20
[C++] 백준 1712  (0) 2022.12.19
[C++] 백준 1316  (1) 2022.12.17