문제 출처 : [BOJ 1193] 분수찾기, https://www.acmicpc.net/problem/1193
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
이와 같이 나열된 분수들을 1/1 -> 1/2 -> 2/1 -> 3/1 -> 2/2 -> … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.
첫째 줄에 분수를 출력한다.
예제 입력
14
예제 출력
2/4
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Fraction {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int x = Integer.parseInt(br.readLine());
// 몇 번째 대각선인지 저장하기 위한 변수
int wave = 1;
// 대각선마다 몇 번째 수인지 검사하기 위한 변수
int check = 0;
// 루프를 탈출하기 위해 누적값을 저장하기 위한 변수
int count = 0;
// 누적값이 입력값과 같아지면 루프 탈출
while(count < x) {
// 각 대각선의 끝에 도달하면 검사용 변수를 초기화 하고 다음 대각선으로 이동
if(wave == check) {
wave++;
check=0;
}
check++;
count++;
}
/*
* 짝수 번 대각선 일 경우 분자는 대각선 마다 검사한 수,
* 분모는 대각선 값에서 검사한 값을 뺀 값에 1을 더해준다.
*/
if(wave % 2 == 0) {
bw.write(check + "/" + (wave - check + 1));
}
// 홀수 번 대각선 일 경우는 분자와 분모를 뒤집어준다
else {
bw.write((wave - check + 1) + "/" + check);
}
bw.flush();
bw.close();
br.close();
}
}
조금 무식하게 푼 감이 없지 않아 있는 것 같다..😢 항상 문제를 풀고 나면 다른 사람은 어떻게 풀었나 확인해보는데, 등차수열로 깔끔하게 푼 사람들도 있고 이 문제 같은 경우에는 각자 풀이가 제각각이라 재밌었다.
이런 수학 구현 문제를 풀 때마다 항상 수학적 사고가 조금 부족하다는 생각이 드는데, 비슷한 문제를 자주 풀어보면서 뇌를 말랑말랑하게 만들어야겠다 ㅎㅎ😋