목차
분수찾기 분류
Bronze II
난이도 제공: solved.ac
시간 제한 |
메모리 제한 |
제출 |
정답 |
맞은 사람 |
정답 비율 |
0.5 초 (추가 시간 없음) |
256 MB |
34020 |
17401 |
15494 |
53.293% |
문제
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
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)가 주어진다.
출력
첫째 줄에 분수를 출력한다.
예제 입력 1
14 |
예제 출력 1
2/4 |
출처
문제를 만든 사람: author6
문제의 오타를 찾은 사람: deadlylaid
어색한 표현을 찾은 사람: djm03178
5달전 코드
#include <iostream>
using namespace std;
int main(){
int x;
cin >> x;
int term = 1;
int n1, n2;
while(x != 0){
if(x > term){
x -= term;
term += 1;}
else
break;}
n1 = 1;
n2 = term;
for(int i=1; i < x; i++){
n1++;
n2--;}
if(term%2)
cout << n2 << '/' << n1;
else
cout << n1 << '/' << n2;
}
5달전 작성한 코드이다.
한 번 읽어보니, 분수가 지그재그로 되면,
1/1 - 1개
1/2 , 2/1 - 2개
3/1, 2/2, 1/3 - 3개
.
.
.
이렇게 된다.
즉, 결국 주어진 수 x는 어떤 수 n! 과 (n+1)! 사이에 존재하게 된다.
여기서 이 n을 알게되면 x - n! 만큼 숫자를 빼고 더해주면 분수를 알게되는것.
설명이 너무 조악하다...
읽는 분들에 게 죄송하다
솔직히 누가 이거 보면 뭔 소리하나 싶을 거 같다. ㅠㅠ 이것도 쓰다보면 늘어나겠지?
솔직히 좀 잘 쓰려고 하면 풀어서 길게 쓰면 될 거같은데, 작성하는데 소모되는 시간의 압박이 상당해서 설명해 투자하기가 애매하다.
계륵같은 존재라고 해야할까.
아무튼 이번에 푼 코드를 보자.
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int i = 1;
while(n - i > 0){
n -= i;
i++;}
if(i%2)
cout << i - (n - 1) << "/" << n;
else
cout << n << "/" << i - (n - 1);
}
어.. 기본 논리구조 자체는 동일하다.
다만 2292번 벌집 문제와 동일하게, 반복문 등의 코드가 간략화 되었다.
사실 5달전 코드만 봐도 왜 저렇게 했을까 싶은데 또 여기서 5달이 지나서 이 포스팅을 보면 왜 또 저렇게 했을까 싶지 않을까?
같은 문제에 같은 논리를 이용해 문제를 풀어도 이렇게 다른 코드가 나온다는게 코딩의 매력인것 같다.
'공부 > 백준' 카테고리의 다른 글
2775번: 부녀회장이 될테야(백준 C++) (0) | 2020.10.13 |
---|---|
10250번: ACM 호텔(백준 C++) (0) | 2020.10.13 |
2869번 : 달팽이는 올라가고 싶다(백준 C++) (0) | 2020.10.13 |
2292번: 벌집(백준 C++) (0) | 2020.10.13 |
2839번 : 설탕 배달(백준 C++) : 네이버 블로그 (0) | 2020.10.13 |