본문 바로가기
👋국비 후기 모음👋 (이력도 확인 가능!)
개발/코테 준비

자바 백준 1193 - 분수찾기 (설명 포함)

by 킴뎁 2021. 10. 26.
728x90
반응형

내 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

//분수찾기(1193)
public class Q_1193 {

    public static void main(String[] args) throws Exception  {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int X = Integer.parseInt(br.readLine());
        int line = 0;
        int line_seq = 0;
        int cnt = 0;
        while(cnt<X) {
            line++;
            line_seq = 0;
            for(int i=0; i<line; i++) {
                cnt++;
                line_seq++;
                if(cnt==X) {
                    break;
                }
            }
        }
        int first = 0;
        int last = 0;
        for(int i=1; i<=line_seq; i++) {
            if(line%2==0) {
                first = i;
                last = line+1-i;
            } else {
                first = line+1-i;
                last = i;
            }
        }
        System.out.println(first + "/" + last);
    }
}

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

이와 같이 나열된 분수들을 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 → 2/1 → 3/1 → 2/2 → …

이 순서를 조금 보기 좋게 나열해보면

1/1
1/2 | 2/1
3/1 | 2/2 |	1/3
1/4 | 2/3 |	3/2 | 4/1
5/1 | 4/2 |	3/3 | 2/4 | 1/5
1/6 | 2/5 |	3/4 | 4/3 | 5/2 | 6/1
...

아래와 같은 규칙을 찾을 수 있다. 

홀수 라인은 앞자리가 라인 숫자부터 짝수 라인은 1부터 시작한다.


X번째가 몇 번째 라인의 몇 번째에 위치하는지 구해보자.

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int X = Integer.parseInt(br.readLine()); //X번째 입력			ex) X가 5일 떄 2/2
        int line = 0;		//line 변수 									line = 3번째 라인의
        int line_seq = 0;	//해당 line의 몇번째 순번인지의 대한 변수		line_seq = 2번째 위치
        int cnt = 0;		//cnt 변수
        
        while(cnt<X) {					//cnt가 X보다 작을때까지만 반복
            line++;						//line + 1 (1, 2, 3, 4, 5 ...)
            line_seq = 0;				//line이 바뀌면(+1되면) 해당 라인의 순번은 초기화
            for(int i=0; i<line; i++) {	//line번 반복
                cnt++;					//cnt가 X가 될 때까지 증가
                line_seq++;				//cnt가 늘수록 순번도 증가
                if(cnt==X) {			//cnt==X일 때,
                    break;				//break;
                }
            }
        }
        //체크용 출력
        //System.out.println("line" + line + "의 " + line_seq + "번째에 위치합니다");

출력 결과


이제 라인과 해당 라인의 몇번째에 위치하는지 구했으니 출력을 구해보자.

홀수 라인은 앞자리가 라인 숫자부터 짝수 라인은 1부터 시작한다.

        //출력은 분수 형태이므로 first/last식으로 출력할 예정
        int first = 0;
        int last = 0;
        for(int i=0; i<line_seq; i++) {	//
            if(line%2==0) {		//짝수 line일 때
                first = i+1;		//frist가 1부터 오름차순
                last = line-i;		//last는 line부터 내림차순
            } else {			//홀수 line일 때
                first = line-i;		//first가 line부터 내림차수
                last = i+1;			//last는 1부터 오름차순
            }
        }
        System.out.println(first + "/" + last); //출력

출력 결과


더 좋은 풀이가 있겠지만 나는 위와 같은 방식으로 풀어냈다. 처음엔 한 4시간 고민하다가 안 풀려서 다른 문제부터 풀고 대략 일주일 만에 다시 풀어본 거 같은데 1시간정도 고민하고 풀어낸듯...? 진짜 풀어냈을 때 좀 많이 기쁨...!! 이 풀이를 보는 사람이라면 아마 조금 어려워서 찾아본 것 일텐데 도움이 되었으면 좋겠다...!!

반응형
👋국비 후기 모음👋 (이력도 확인 가능!)

댓글