728x90
시간제한 : 0.5 초 (추가 시간 없음)
문제
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
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 | 1/1 |
2 | 1/2 |
3 | 2/1 |
4 | 3/1 |
5 | 2/2 |
6 | 1/3 |
7 | 1/4 |
8 | 2/3 |
9 | 3/2 |
14 | 2/4 |
문제풀이
어떻게 멋지게 할까....... ? 생각하다가 포기하고 간단하게 작성하기로 했다.
어떤 방식으로 했을까?
순서에 따라 증감되는 값에서 하나의 기준을 찾아서 계산하기로 했다.
0/+1
+1/-1
+1/0
-1/+1
-1/+1
0/+1
+1/-1
+1/-1
+1/-1
+1/0
-1/+1
-1/+1
-1/+1
-1/+1
0/+1
어떤 기준이 있는지 보이는가?
0을 기준으로 왔다갔다 할 때마다 0 중간에 +1값이 1개씩 늘어나고
+1, -1 또는 -1, +1 이 되고 있으며
값이 1이 되었을 경우 더이상 내려가지 않도록 되어 있다.
이를 0을 기준으로 switch 개념 + count가 증가하도록 활용하여 다음과 같이 작성하였다.
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
Scanner scan = new Scanner(System.in);
int index = scan.nextInt();
int x = 1, y = 1;
int count = 1, tmp = 0;
boolean sw = true;
for(int i = 1; i < index; i++){
tmp++;
if(sw){
y++;
if(x!=1) x--;
} else {
x++;
if(y!=1) y--;
}
if(count == tmp){
sw = !sw;
tmp=0;
count++;
}
}
System.out.println(x+"/"+y);
}
}
다음엔 더 멋있게 짤 수 있겠지....
728x90
'Etc > problem solving' 카테고리의 다른 글
백준 2292, 벌집 (0) | 2021.11.12 |
---|---|
백준 1712, 손익분기점 (0) | 2021.11.12 |
백준 1316, 그룹 단어 체커 (0) | 2021.11.06 |
백준 2750, 수 정렬하기 (0) | 2021.11.04 |
백준 2941, 크로아티아 알파벳 (0) | 2021.11.03 |