KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (487)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • LeetCode
  • Level 2
  • C++
  • js
  • 그래프
  • Level 1
  • 문자열
  • 정렬
  • programmers
  • 다이나믹 프로그래밍
  • tree
  • recursion
  • C
  • 제코베 JS 100제
  • codeup
  • string
  • 백준
  • 수학
  • Level1
  • Level 0

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

백준 / 수학 / 1193번 / 분수찾기 / C++
PS/백준

백준 / 수학 / 1193번 / 분수찾기 / C++

2022. 1. 9. 17:31

문제

 

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

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)가 주어진다.

출력

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

 

#include <iostream>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	// x번째 분수 
	int x;
	cin >> x;
	
	// 첫번째 대각선의 분수의 개수 = 1 
	int i = 1; // i번째 대각선 
	 
	while(x > i) {
		x -= i;
		i++;
	}
	
	// 홀수번째 대각선에서는 분자가 i부터 시작
	if(i % 2 == 1) {
		// i번째 대각선에는 i개의 분수가 있음.
		// x는 i번째 대각선에서 몇번째에 있는지 나타냄.
		cout << i - x + 1 << "/" << x << '\n';
	} 
	else {
		cout << x << "/" << i - x + 1 << '\n';
	}
	
	return 0;
}

조금 헷갈렸지만 간단한 문제이다.

경로를 그려보면 

1/1 을 첫번째 대각선이라고 할때, 홀수번째 대각선에서는 위로가고,

짝수번째 대각선에서는 아래로 간다.

 

다시 코드에서 반복문을 보면, i가 1부터 시작해서 x -= i;를 해주고 i++를 해준다.

표를 보면 i번째 대각선에는 i개의 분수가 있는것을 알 수 있다.

따라서 입력받은 x에서 i번째의 분수의 개수를 순차적으로 빼주는것이다.

 

만약 x로 14를 입력받았다면, 14에서 1,2,3,4를 빼주는 것이다.

그러면 x는 4가되고 빼준 후에 마지막에 i++를 해주었기 때문에 i=5가 되고 반복문은 종료된다.

 

x=4, i=5가 의미하는것은 i번째 대각선에서 x번째 분수라는 뜻이다.

5번째 대각선을 살펴보면 분자의 규칙성이 있다.

i-0, i-1, i-2, i-3, i-4로 분자의 순서가 이어진다.

따라서 분자를 구하려면 i-x+1을 해주면된다.

 

결론적으로 i가 홀수일때, 즉 화살표가 위로갈때는 i-x+1/x 이고,

짝수일때, 즉 화살표가 아래로갈때는 x/i-x+1이 된다.

저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

백준 / 수학 / 2839번 / 설탕 배달 / C++  (0) 2022.01.10
백준 / 수학 / 2775번 / 부녀회장이 될테야 / C++  (0) 2022.01.09
백준 / 수학 / 2869번 / 달팽이는 올라가고 싶다 / C++  (0) 2022.01.07
백준 / 정렬 / 2751번 / 수 정렬하기 2 / C++  (0) 2021.09.17
    'PS/백준' 카테고리의 다른 글
    • 백준 / 수학 / 2839번 / 설탕 배달 / C++
    • 백준 / 수학 / 2775번 / 부녀회장이 될테야 / C++
    • 백준 / 수학 / 2869번 / 달팽이는 올라가고 싶다 / C++
    • 백준 / 정렬 / 2751번 / 수 정렬하기 2 / C++
    KimMinJun
    KimMinJun

    티스토리툴바