λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[SW Expert Academy] - (D3)1493. 수의 μƒˆλ‘œμš΄ μ—°μ‚°

by 주발2 2020. 6. 1.
λ°˜μ‘ν˜•

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV2b-QGqADMBBASw&categoryId=AV2b-QGqADMBBASw&categoryType=CODE

 

SW Expert Academy

SW ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰ 강화에 도움이 λ˜λŠ” λ‹€μ–‘ν•œ ν•™μŠ΅ 컨텐츠λ₯Ό ν™•μΈν•˜μ„Έμš”!

swexpertacademy.com

 

μ½”λ“œ

import java.util.Scanner;

public class Solution {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int T = scan.nextInt();
		
		for(int tc=1; tc<=T; tc++) {
			int p = scan.nextInt();
			int q = scan.nextInt();
			int result = 0;
			
			/* 첫번째 값에 λŒ€ν•œ x, y μ’Œν‘œ */
			int sum1 = 0;
			int x1 = 0;
			int y1 = 0;
			
			for(int i=1; ; i++) {
				sum1 += i;
				if(sum1 >= p) {
					x1 = i - (sum1-p);
					y1 = (i+1) - x1;
					break;
				}
			}
			
			/* λ‘λ²ˆμ§Έ 값에 λŒ€ν•œ  x, y μ’Œν‘œ */
			int sum2 = 0;
			int x2 = 0;
			int y2 = 0;
			for(int i=1; ; i++) {
				sum2 += i;
				if(sum2 >= q) {
					x2 = i - (sum2-q);
					y2 = (i+1) - x2;
					break;
				}
			}
			
			/* μ΅œμ’… x, y μ’Œν‘œ */
			int x3 = x1 + x2;
			int y3 = y1 + y2;
			int sum3 = 1;
			for(int i=1; i<(x3+y3)-1; i++) {
				sum3 += i;
			}
			result = sum3 + (x3-1);
			
			System.out.println("#" + tc + " " + result);
			//System.out.println(x1 + " " + y1 + " " + x2 + " " + y2);
			
		}
		

		
		scan.close();
	}

}

풀이

음.. κ·œμΉ™μ„ μ°ΎλŠ”κ²Œ μ’€ ν—·κ°ˆλ Έλ‹€.

λ¬Έμ œμ—μ„œλŠ” μ’Œν‘œκ°€ μ•„λ‹Œ μ’Œν‘œμ˜ 값이 주어진닀.

예λ₯Όλ“€μ–΄ κ·Έλ¦Όμ—μ„œ 1의 μ’Œν‘œλŠ” (1 , 1) 이고, 5의 μ’Œν‘œλŠ” (2 , 2) 이닀.

λ”°λΌμ„œ 두 μ—°μ‚° β˜…λŠ” (1 + 2, 1 + 2) 의 값을 κ΅¬ν•˜λŠ” 것이닀.

 

λ”°λΌμ„œ λ‹€μŒκ³Ό 같이 문제λ₯Ό μƒκ°ν•˜κ³  ν’€μ—ˆλ‹€.

 1. 주어진 λ‘κ°œμ˜ 값에 λŒ€ν•œ μ’Œν‘œλ₯Ό μ°ΎλŠ”λ‹€.

 2. 두 μ’Œν‘œκ°’μ„ x, y μ’Œν‘œλΌλ¦¬ λ”ν•œλ‹€

 3. μ΅œμ’…μ μœΌλ‘œ λ‚˜μ˜¨ x, y μ’Œν‘œμ˜ 값을 κ΅¬ν•œλ‹€.

 

λ¬Έμ œμ—μ„œ 평면은 항상 λŒ€κ°μ„  μ•„λž˜μͺ½μœΌλ‘œ 값이 μ§„ν–‰λœλ‹€.

κ·Έ κ°―μˆ˜λŠ” 1개 2개 3개 ... n개 식이닀.

λ”°λΌμ„œ 값이 μ£Όμ–΄μ‘Œμ„λ•Œ, κ·Έ 값이 λͺ‡λ²ˆμ§Έ λŒ€κ°μ„ μ— ν•΄λ‹Ήν•˜λŠ”μ§€λΆ€ν„° μ°Ύμ•˜λ‹€.

λͺ‡λ²ˆμ§Έ λŒ€κ°μ„ μ— μ‘΄μž¬ν•˜λŠ”μ§€λŠ” 1λΆ€ν„° λ”ν•œκ°’μ΄ p보닀 μ»€μ§ˆλ•Œμ˜ i값이닀.

 

9(3, 2)λ₯Ό μ˜ˆλ‘œλ“€λ©΄ 1+2+3+4 = 10(sum) 이고, 9(p)보닀 ν¬λ―€λ‘œ 4번째 λŒ€κ°μ„ μ˜ 라인(i=4)에 μ‘΄μž¬ν•œλ‹€.

4번째 라인에 μ‘΄μž¬ν•˜λŠ” μˆ˜λ“€μ€ xμ’Œν‘œ + yμ’Œν‘œμ˜ 값이 5이닀.

 

x의 μ’Œν‘œλŠ” iκ°’μ—μ„œ (sum-p) λ₯Ό λΊ€ 값이고,

x + y = (i+1) μ΄λΌλŠ” 식이 μ„±λ¦½ν•˜λ―€λ‘œ, y = (i+1) - x λΌλŠ” 식이 μ„±λ¦½ν•œλ‹€.

μ΅œμ’…μ μœΌλ‘œ x, y μ’Œν‘œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

x1 = i - (sum1-p);
y1 = (i+1) - x1;

μœ„ κ·œμΉ™μœΌλ‘œ 첫번째, λ‘λ²ˆμ§Έ 값에 λŒ€ν•œ x, y μ’Œν‘œκ°’μ„ 찾을 수 μžˆλ‹€.

 

 

 

μ΅œμ’…μ μœΌλ‘œ 두 x, y μ’Œν‘œμ˜ ν•©μ—λŒ€ν•œ 값을 ꡬ해야 ν•œλ‹€.

μ΄κ±°λŠ” λ‚˜λŠ” (1, y)에 μ‘΄μž¬ν•˜λŠ” κ°€μž₯ 쒌츑 κΌ­λŒ€κΈ°κ°’μ„ λ¨Όμ € μ°Ύμ•„μ£Όμ—ˆλ‹€.

(1,1) = 1

(1,2) = 2

(1,3) = 4

(1,4) = 7

(1,5) = 11 ...

μœ„ 식에도 1, 2, 3, 4 μ”© μ¦κ°€ν•˜λŠ” κ·œμΉ™μ΄ μ‘΄μž¬ν•œλ‹€.

 

13(3, 3)을 μ˜ˆλ‘œλ“€λ©΄ κ°€μž₯ 쒌츑 κΌ­λŒ€κΈ°μ˜ 값은 11(1, 5) 이닀.

11 = 1+ 1+2+3+4 의 값이닀.

즉 i=1 λΆ€ν„° (3+3)-2 κΉŒμ§€ λ”ν•œ κ°’κ³Ό λ™μΌν•˜λ‹€.

for(int i=1; i<(x3+y3)-1; i++) {
	sum3 += i;
}

λ”°λΌμ„œ μœ„ for문으둜 κ°€μž₯ μ™Όμͺ½ κΌ­λŒ€κΈ°μ˜ 값을 ꡬ할 수 있고,

 

κ·Έ 이후에 ν•΄λ‹Ή x, y μ’Œν‘œκ°’μ€ λͺ‡κ°œμ˜ xμ’Œν‘œλ§ŒνΌ μ΄λ™ν–ˆλŠ”μ§€ λ”ν•˜λ©΄ λœλ‹€.

result = sum3 + (x3-1);

 

λ°˜μ‘ν˜•

λŒ“κΈ€