https://www.acmicpc.net/problem/1193
1193번: 분수찾기
첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.
www.acmicpc.net
i번째 대각선의 분수의 개수는 i개이고, 분모와 분자의 합은 i + 1이므로 이를 이용해서 분수를 빠르게 검색할 수 있다.
우선 i를 1부터 차례로 X가 음수가 될 때까지 빼고, 이렇게 얻은 음수 X'는 목표 분수의 현재 대각선에서의 순서이므로
이를 이용하면 쉽게 답을 구할 수 있다.
#include <cstdio>
int main() {
// X : 분수의 위치를 특정할 때 사용할 변수
// i: 각 대각선에 있는 분수의 개수
// up, down : 각각 분수의 분자와 분모
int X, i = 0, up, down;
// X가 음수로 변한 대각선에서
//대각선이 오른쪽 위로 올라가는지 혹은 왼쪽 아래로 내려가는지 판정
bool isDown = false;
scanf("%d", &X);
// X가 양수일 때, 즉 i이 원하는 값보다 작을 때
while (X > 0) {
// 대각선 안의 분수가 하나 더 추가되었으므로 i를 1 증가시키고
// num을 i만큼, 즉 분모와 분자의 합이 i인 분수의 개수만큼 뺀다
X -= ++i;
//다음 대각선은 지금 대각선과 분수의 진행 방향이 다르다
isDown = !isDown;
}
// 음수 X의 절댓값은 (목표 분수의 현재 대각선에서의 순서) - 1이고
// i는 현재 대각선에서의 가장 큰 분모값이다
// up과 down에 분수의 방향에 맞게끔 분자값과 분모값을 계산해 넣어준다
if (isDown) { up = 1 - X; down = i + X; }
else { up = i + X; down = 1 - X; }
//분수를 출력한다
printf("%d/%d\n", up, down);
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
1238번: 파티 (0) | 2021.12.07 |
---|---|
1197번: 최소 스패닝 트리 (0) | 2021.12.07 |
1181번: 단어 정렬 (0) | 2021.12.07 |
1167번: 트리의 지름 (0) | 2021.12.07 |
1158번: 요세푸스 문제 (0) | 2021.12.07 |