문제
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
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
두 번째 대각선까지 값의 개수 = 3
세 번째 대각선까지 값의 개수 = 6
첫 번째 대각선부터 n번째 대각선까지 총 값의 개수를 공식화하면 cnt=n*(n+1)/2;가 되고
아래 코드를 통해 입력된 X가 몇 번째 대각선에 있는지 구할 수 있다.
int n=0; //몇 번째 대각선인지 찾는 코드
int cnt=0;
while(cnt<X){
n++;
cnt=n*(n+1)/2;
}
대각선의 번호를 찾았다면, 입력된 값이 그 대각선 안에서 몇 번 째에 있는지 정보를 구해야 한다.
X에서 이전 대각선까지의 총 값의 개수를 빼주면 현재 대각선에서 몇 번째 위치의 값인지 알 수 있다
ex) X=5일 때, 5는 3번째 대각선에 위치하고,
5 - (1~2번째 대각선까지 총 값의 개수) = 5 - 3 = 2 => 3번 대각선에서 2번째 값을 가진다.
최종적으로 정답을 구할 때에는,
빨간 화살표의 위로 올라오는 방향(홀수 값의 대각선 값)
파란 화살표의 아래로 내려가는 방향(짝수 값의 대각선 값)을 나눠서 출력해줘야 함에 유의하자.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ex1193_분수찾기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int X = Integer.parseInt(br.readLine());
int n=0; //몇 번째 대각선인지 찾는 코드
int cnt=0;
while(cnt<X){
n++;
cnt=n*(n+1)/2;
}
int num = X-(n-1)*n/2; //대각선에서 몇 번째 위치인지 찾는 코드
//X-이전 대각선까지의 값의 개수
int bunja, bunmo;
if(n%2==0){
bunja=1; bunmo=n; //1번째 칸에서 세기 시작
for (int i = 0; i < num-1; i++) { //반복횟수 1감소시켜야 함
bunja++;
bunmo--;
}
}else{
bunja=n; bunmo=1;
for (int i = 0; i < num-1; i++) {
bunja--;
bunmo++;
}
}
System.out.println(bunja+"/"+bunmo);
}
}
'Algorithm > 백준' 카테고리의 다른 글
[백준/JAVA] 🥇 16234번 인구 이동 (1) | 2023.12.31 |
---|---|
[백준/JAVA] 🥈 1138번 한 줄로 서기 (0) | 2023.12.30 |
[백준/JAVA] 🥈 1063번 킹 (1) | 2023.12.30 |
[백준/JAVA] 🥈 1051번 숫자 정사각형 (0) | 2023.12.29 |
[백준/JAVA] 🥈 1966번 프린터 큐 (1) | 2023.12.26 |