• toc {:toc}

문제

λ¬΄ν•œνžˆ 큰 배열에 λ‹€μŒκ³Ό 같이 λΆ„μˆ˜λ“€μ΄Β μ ν˜€μžˆλ‹€.

find-fraction

이와 같이 λ‚˜μ—΄λœ λΆ„μˆ˜λ“€μ„ 1/1 β†’ 1/2 β†’ 2/1 β†’ 3/1 β†’Β 2/2 β†’ … κ³Ό 같은 μ§€κ·Έμž¬κ·Έ μˆœμ„œλ‘œ μ°¨λ‘€λŒ€λ‘œ 1 번, 2 번, 3 번, 4 번, 5 번, … λΆ„μˆ˜λΌκ³  ν•˜μž.

X κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, X 번째 λΆ„μˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 X(1 ≀ X ≀ 10,000,000) κ°€ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 쀄에 λΆ„μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€.

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

풀이

(사싀 κ΅°λŒ€ λ™κΈ°μ˜ 도움을 λ°›μ•„ 아이디어λ₯Ό μ–»μ—ˆλ‹€.)

이 λ¬Έμ œλŠ” μ§€κ·Έμž¬κ·Έμ˜ μˆœμ„œλ‘œ μ΄λ™ν•˜μ—¬ λΆ„μˆ˜λ₯Ό μ„ νƒν•œλ‹€.

λ•Œλ¬Έμ— / 와 같이 λŒ€κ°μ„ μœΌλ‘œ λ‚˜λˆ„μ–΄ 보면 1 λ²ˆμ§Έμ— 1 개, 2 λ²ˆμ§Έμ— 2 개, 3 λ²ˆμ§Έμ— 3 개둜 μ€„λ§ˆλ‹€ +1 μ”© λŠ˜μ–΄λ‚œλ‹€. 이 λΆ€λΆ„μ—μ„œ μ‹œκ·Έλ§ˆλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” 점을 μ°Ύμ•˜λ‹€.

  1. μ‹œκ·Έλ§ˆλ₯Ό μ‚¬μš©ν•˜μ—¬ 숫자λ₯Ό 선택해야 ν•˜λŠ” 쀄이 λͺ‡ 번째 쀄인지λ₯Ό μ°Ύμ•„λ‚Έλ‹€.
  2. X-βˆ‘m 을 ν†΅ν•΄μ„œ κ·Έ 쀄에 μ–΄λŠ μœ„μΉ˜μ— μžˆλŠ”μ§€ μ°Ύμ•„λ‚Έλ‹€.
  3. μœ„μΉ˜λ₯Ό μ°Ύμ•„λ‚Ό λ•Œ ν™€μˆ˜λŠ” μ•„λž˜μ—μ„œ μœ„λ‘œ, μ§μˆ˜λŠ” μœ„μ—μ„œ μ•„λž˜λ‘œ λ‚΄λ €κ°„λ‹€λŠ” 점을 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

EX) X=17 이라고 ν•˜λ©΄ m=5 κ°€ λœλ‹€. 17 보닀 μž‘μ€ βˆ‘m 은 15 이기 λ•Œλ¬Έ. 17-15=2 둜 X κ°€ μžˆλŠ” μœ„μΉ˜λŠ” 6 번째 μ€„μ˜ 2 번째 μœ„μΉ˜μ— μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

#include <iostream>
 
using namespace std;
 
int main()
{
	int x, m=1, midValue, numerator, denominator;
	cin >> x;
	while((m*m+m)/2<x)
	{
		m++;
	}
	m--;
	midValue = x-((m*m+m)/2);
	if((m+1)%2==0)	// 쀑간값이 짝수일 λ•Œ
	{
		numerator = 1;
		denominator = m+1;
		for(int i=1; i<midValue; i++)
		{
			numerator++;
			denominator--;
		}
	}
	else
	{
		numerator = m+1;
		denominator = 1;
		for(int i=1; i<midValue; i++)
		{
			numerator--;
			denominator++;
		}
	}
	
	cout << numerator << "/" << denominator << endl;
		
	return 0;
}

μ½”λ“œκ°€ μ›Œλ‚™ μ€‘κ΅¬λ‚œλ°© λ”λŸ¬μ›Œμ„œ λ‹€λ₯Έ 풀이λ₯Ό μ°Έκ³ ν•˜λ©΄μ„œ κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•˜λŠ” 방법을 생각해봐야 ν•  것 κ°™λ‹€.