1193. 분수 찾기 [JAVA]

Nak.s·2023년 1월 16일
0

CodeTest

목록 보기
9/19

x번째의 수가 해당 대각선 라인의 등차수열 합과 그 이전 대각선 라인의 합 사이에 있을때,

x에서 시작점을 빼고 끝점에서 x를 뺀 후 분모 혹은 분자를 할당해주면된다.
짝수번째 대각선 라인과, 홀수 번째 대각선 라인은 진행 방향이 반대이기 때문.

공차가 1이고 시작이 1인 등차수열은 고정.
ex) x가 9 일때, 9는 6(1+2+3) 과 10(1+2+3+4) 사이에 존재.
그리고 짝수 라인은 진행방향이 왼쪽 사선 아래로 정해져있음. (홀수 라인은 오른쪽 사선 위)

따라서 9번째 분수인 3/2가 나오려면,
분모는 10 - 9 + 1 = 2
분자는 9 - 6 = 3
을 하면 된다.

홀수는 분모 분자식을 바꿔주기만 하면 된다.

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int ip = scanner.nextInt();

        int i = 1; //등차수열의 합을 위한 기준
        
        int denominator = 1; //분모
        int numerator = 1;   //분자
        if(ip == 1) {
            System.out.println(String.valueOf(numerator) + "/" + String.valueOf(denominator));
            return;
        }

        // 등차수열 공식
        // 첫항 마지막항 알때 n(a+l) / 2
        // 첫항, 공차 알때 n{2a + (n-1)}d} / 2
        while (true) {
            int prev = (i * (i + 1)) / 2;               // 단계별 현재 등차수열 합.
            int next = ((i + 1) * ((i + 1) + 1)) / 2;   // 단계별 그 다음항 까지 등차수열 합.
            
            if (prev < ip && ip <= next) {
                if(i % 2 == 0){
                    numerator = next - ip + 1;    // 나머지가 0이면 왼쪽 사선 아래로 진행
                    denominator = ip - prev; 
                } else {                          // 나머지가 1이면 오른쪽 사선 위로 진행
                    denominator = next - ip + 1;
                    numerator = ip - prev;
                }
                break;
            }
            i++;
        }
        System.out.println(String.valueOf(numerator) + "/" + String.valueOf(denominator));
    }
profile
궁금함이 많은 개발자

0개의 댓글