문제
https://www.acmicpc.net/problem/1193
소스코드
#include <iostream>
using namespace std;
int main(void) {
int X; cin >> X;
if (X == 1) {
cout << "1/1" << endl; return 0;
}
int n = 1;
while (1) {
//종료조건
if ((n+2)*(n + 1) / 2 >= X) break;
n++;
}
int rest = X - n * (n + 1) / 2;
int up, down;
if (n % 2) {
up = rest; down = n - rest + 2;
}
else {
up = n - rest + 2; down = rest;
}
cout << up << '/' << down << endl;
}
코드설명
1. n까지의 합은 n*(n+1)/2 입니다. X 이하의 n의 최댓값을 구합니다. (while문)
2. X에서 n*(n+1)/2 이 값을 빼주어서 [0, n] 또는 [n, 0]에서 몇 칸이나 더 움직여야 하는지 계산합니다.
3. n이 짝수일 때와 홀수 일 때로 나누어서 분자와 분모를 구해줍니다. n이 만약 홀수라면 X는 n+1 그룹에 속하므로 시작하는 분수[n, 0]에서 오른쪽 위로 올라갈 것이고, 짝수라면 시작하는 분수[0, n]에서 왼쪽 아래로 내려갈 것입니다.
'개인 공부 > 코딩테스트' 카테고리의 다른 글
[C++] 백준 10250번 ACM 호텔 :: seoftware (0) | 2020.03.13 |
---|---|
[C++] 백준 10814번 나이순 정렬 :: seoftware (0) | 2020.03.13 |
[C++] 백준 1011번 Fly me to the Alpha Centauri :: seoftware (0) | 2020.03.07 |
[C++] 백준 10989번 수 정렬하기 3 :: seoftware (0) | 2020.03.06 |
[C++] 백준 2751번 수 정렬하기 2 :: seoftware (0) | 2020.03.06 |
댓글