Algorithm/기타

[백준 1193번] 분수찾기

agility 2019. 12. 27. 20:58

백준알고리즘 1193번 : 분수찾기

 

어떻게 접근하는 지 알게되고나면 어렵지 않은 문제라고 생각한다.

그러나 언제나 그 접근 방법이 어렵다.

 

분모와 분자의 합을 S라고 하자,

이 X를 기준으로 1행(혹은 1열)을 보게되면, {2, 3, 4, 5,....} 와 같이 한 개씩 늘어나는 것을 확인할 수 있다.

그리고 행을 기준으로 왼쪽 아래의 대각선으로 한칸씩 내려가면,

하나의 대각선은 모두 동일한 S값을 갖고 있음을 알 수 있다.

 

그렇다면 우리가 구하고자하는 N번째 수가 1행의 몇 번째 열에 해당하는 대각선에 있는지 알 수 있다면,

적절한 계산을 통해 구할 수 있을 것이다.

 

각 대각선의 길이는 1, 2, 3...순으로 1씩 증가하는 등차수열이므로,

등차수열의 합 공식 n(n+1)/2  을 이용하여 대각선 길이의 총 합이 구하고자하는 X 값보다 커지는 지점을 확인하고,

이를 보정해주면 되겠다.

 

 

풀이 과정


1. 등차수열의 합 n(n+1)/2 공식을 이용하여,
  대각선의 총 합이 구하고자하는 X보다 크거나 같을 때의 대각선 길이 n을 구한다.
  X는 즉 n번째 대각선 어딘가에 있을 것이며, 이를 보정해주어야한다.
2. 대각선의 길이 n이 짝수면, 첫 row(마지막 column)부터 셈이 이뤄지고
   대각선의 길이 n이 홀수면, 마지막 row(첫 column)부터 셈이 이뤄진다.
3. 이에 맞추어 적절한 출력을 해준다.

 

 

 

 

소스 ▽

더보기
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int num = sc.nextInt();
		int count = 0;
		int length = 0;//대각선의 길이
		while (count<num) { 
			length++;
			count = length *(length+1) / 2;
		}//대각선의 총 합이 구하고자하는 수의 번째보다 크거나 같으면 stop.
		//즉 우리의 num은 마지막 length만큼의 대각선 사이에 있을 것이다.

		//해당 대각선까지의 총함 - 구하고자하는 X번째 만큼을 보정해주어야한다.
		int move = count-num;
		//length가 짝수면, 첫 row(마지막 column)부터 셈이 이뤄지고,
		//length가 홀수면, 마지막 row(첫 column)부터 셈이 이뤄진다. 
		if (length%2==0) {
			System.out.println((length-move)+"/"+(1+move));
		}else {
			System.out.println((1+move)+"/"+(length-move));
		}
	}

}

 

 

 

Summary


등차수열의 합 S =n(n+1)/2