본문 바로가기
프로그래밍/백준 알고리즘 코드

백준 1193번 java 자바 분수찾기 [수학1]

by 졸린이 2020. 11. 28.
반응형

하이고... 백준 문제 정주행 좀 꾸준히 하고 싶었는데 요새 너무 정신없이 살다보니 너무 오랜만에 작성하게 되었다.

사람이 이렇게까지 게을러지는구나 느끼고 있는 요즘이다. 아무튼 본론으로 가보자.

 

 

분수가 행렬형태로 다음과 같이 주어져 있고 입력한 값 번째 위치한 분수를 지그재그 형태로 찾아가는 것이다.

뭐 문제에 다 나와 있는 있는 설명이다. 위에 화살표로 표신된 그림처럼 찾아가는 것이다.

주어진 x가 3이라면 1/2 가 출력될 것이다.

우선 코드를 봐보도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Scanner;
 
//baekjoon_1193_분수찾기
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int x = sc.nextInt();
        int i=1;
        int sum = 0;
        int top = 1, bot = 1;
        
        while(true) {
            sum += i;
            if(sum >= x) {
                break;
            }
            i++;
        }
        if( i % 2 == 0) {
            for(int j =0; j<=sum-x; j++) {
                top = i-j;
                bot = j+1;
            }
        } else {
            for(int j=0; j<=sum-x; j++) {
                bot = i-j;
                top = j+1;
            }
        }
        System.out.println(top + "/" + bot);
    }
}
cs

line8 : 몇 번째 분수를 찾을지 입력한다.

while문에서 sum이 x보다 같거나 커지는 값을 찾는데 이것은 찾는 분수의 위치가 어디인지 찾기 위함이다.

아주 간단한 규칙을 보자면 배열을 횡단할 때 대각선으로 내려갈 때가 있고 올라갈 때가 있다.

즉 1/2 => 2/1은 내려가는 것이고 3/1 => 2/2 => 1/3은 올라가는 것이다.

내려갈 때는 분자가 커지고 분모가 작아진다. 올라갈때는 분자가 작아지고 분모는 커진다. 이 규칙을 이용할 것이다.

i 값을 증가시키면서 sum에 더해주는 이유는 올라가면서 찾는 중인지 내려가면서 찾는 중인지 검사하기 위함이다.

목표치 까지 찾아나갈 때 올라갈지 내려갈지 방향을 바꾸는 값은 1씩 증가하므로 (처음엔 1, 2, 3, 4, 5...)

sum이 6이면 i는 3이고 방향을 3번째 튼 것이고 올라가는 중이고 3/1, 2/2, 1/3이 기준안에 있으며 x는 (4, 5, 6)중 입력한 것이다. 

 

아 진짜 설명 개 떡 뭔 개소리를 적어논거 같네... 내가 개 빡대가리여서 엄청 쉬운 과정도 개 이상하게 설명하는 버릇이 있는데 똑똑한 여러분이 이해를 좀 해주셨음 좋겠네요.

 

아무튼 그렇게 sum을 찾고 i를 찾았으면 이제 값을 찾으면 된다.

if else 문으로 i가 홀수인지 짝수인지(올라가는 중인지 내려가는 중인지) 판별하여 sum내에 있는 x값까지만 for문을 돌면서 top, bot(분자, 분모)값을 더하거나 빼주면서 찾는다.

 

진~~짜 설명이 더 어렵다.

초등학생이 보고 알아들었으면 좋겠다 생각하고 작성을 시작한 글이지만 쉬운 코드도 어렵게 설명하니 초등학생이 와서 머리 한 대 쳐도 할말이 없겠다.

 

반응형

댓글