๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 1977๋ฒˆ: ์™„์ „์ œ๊ณฑ์ˆ˜

by ์ฃผ๋ฐœ2 2020. 1. 18.
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/1977

 

1977๋ฒˆ: ์™„์ „์ œ๊ณฑ์ˆ˜

M๊ณผ N์ด ์ฃผ์–ด์งˆ ๋•Œ M์ด์ƒ N์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ์ค‘ ์™„์ „์ œ๊ณฑ์ˆ˜์ธ ๊ฒƒ์„ ๋ชจ๋‘ ๊ณจ๋ผ ๊ทธ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ๊ทธ ์ค‘ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด M=60, N=100์ธ ๊ฒฝ์šฐ 60์ด์ƒ 100์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ์ค‘ ์™„์ „์ œ๊ณฑ์ˆ˜๋Š” 64,  81,  100 ์ด๋ ‡๊ฒŒ ์ด 3๊ฐœ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ํ•ฉ์€ 245๊ฐ€ ๋˜๊ณ  ์ด ์ค‘ ์ตœ์†Ÿ๊ฐ’์€ 64๊ฐ€ ๋œ๋‹ค.

www.acmicpc.net

 

 

์ฝ”๋“œ

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int M = scan.nextInt();
		int N = scan.nextInt();
		int sum = 0;			// ์™„์ „ ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ
		int min = 10001;		// ์™„์ „ ์ œ๊ณฑ์ˆ˜ ์ค‘ ์ตœ์†Ÿ๊ฐ’
		boolean flag = false;	// ์™„์ „ ์ œ๊ณฑ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํŒ๋ณ„
		double dNsqrt = Math.sqrt(N);	// N์˜ ์ œ๊ณฑ๊ทผ
		int Nsqrt = Integer.parseInt(String.valueOf(Math.round(dNsqrt)));	// doubleํ˜• N์˜ ์ œ๊ณฑ๊ทผ => intํ˜• ํ˜•๋ณ€ํ™˜
		
		for(int i=M; i<=N; i++) {
			for(int j=1; j<=Nsqrt; j++) {
				
				// i๊ฐ€ ์™„์ „ ์ œ๊ณฑ์ˆ˜์ผ๋•Œ
				if(j*j == i) {
					sum += i;
					if(min > i) min = i;
					flag = true;
					break;
				}
			}
		}
		
		if(flag)
			System.out.println(sum + "\n" + min);
		else
			System.out.println("-1");
		scan.close();
	}
}

 

 

ํ’€์ด

์ฃผ์–ด์ง„ M ~ N ๊นŒ์ง€์˜ ์ˆซ์ž ์ค‘ ์™„์ „์ œ๊ณฑ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

M ~ N์ค‘ ์™„์ „์ œ๊ณฑ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด flag๊ฐ’์„ true๋กœ ๋ณ€๊ฒฝํ•ด ์™„์ „์ œ๊ณฑ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ €์žฅํ•œ๋‹ค.

for๋ฌธ ๋ฐ˜๋ณต์ด ๋๋‚˜๊ณ , flag๊ฐ€ true์ด๋ฉด ์™„์ „์ œ๊ณฑ์ˆ˜๊ฐ€ ์žˆ๋Š”๊ฒฝ์šฐ, false๋ฉด ์™„์ „์ œ๊ณฑ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

 

 

N์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ 10,000์ด๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์„ 1~100๊นŒ์ง€ ํ•˜๋Š”๊ฒƒ๊ณผ, 1~N์˜ ์ œ๊ณฑ๊ทผ์˜ ๋ฐ˜์˜ฌ๋ฆผ๊นŒ์ง€ ํ•˜๋Š”๊ฒƒ ๊ณผ ์‹œ๊ฐ„์ฐจ์ด๊ฐ€ ๋ณ„๋กœ ์—†์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ N ์ œ๊ณฑ๊ทผ์˜ ๋ฐ˜์˜ฌ๋ฆผ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์ฃผ์—ˆ๋‹ค.

N์ด 100์ผ๋•Œ => 1 ~ 100๊นŒ์ง€ ๊ฒ€์ƒ‰ํ•˜๋Š”๊ฒƒ์ด ์•„๋‹Œ N์˜ ์ œ๊ณฑ๊ทผ(10)๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ œ๊ณฑ์ˆ˜๋ฅผ ์ฐพ๋„๋ก ํ–ˆ๋‹ค.

double dNsqrt = Math.sqrt(N); // N์˜ ์ œ๊ณฑ๊ทผ

 

dNsqrt๋ณ€์ˆ˜๋Š” ์ž…๋ ฅ๋ฐ›์€ N์„ double ํ˜•์œผ๋กœ ์ œ๊ณฑ๊ทผ์„ ์ฐพ๋Š”๋‹ค.

doubleํ˜• ์†Œ์ˆ˜์ด๋ฏ€๋กœ, ์ •์ˆ˜๋กœ ํ˜•๋ณ€ํ™˜ ํ•ด์ค€๋‹ค.

int Nsqrt = Integer.parseInt(String.valueOf(Math.round(dNsqrt)));	// doubleํ˜• N์˜ ์ œ๊ณฑ๊ทผ => intํ˜• ํ˜•๋ณ€ํ™˜

 

์œ„ ๋ฌธ์žฅ์„ ํ†ตํ•ด ์ •์ˆ˜๋กœ ํ˜•๋ณ€ํ™˜์ด ๋œ๋‹ค.

Math.round() ํ•จ์ˆ˜๋Š” ๋ฐ˜์˜ฌ๋ฆผ์„ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค.

 

 

https://docs.oracle.com/javase/9/docs/api/java/lang/Math.html

 

 

 

Math.sqrt() ํ•จ์ˆ˜์™€

double -> int ํ˜•๋ณ€ํ™˜ ํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

public class Test {

	public static void main(String[] args) {
		int num1 = 64;
		int num2 = 65;
		int num3 = 80;
		int num4 = 81;
		double dNum1 = Math.sqrt(num1);	// 8.0
		double dNum2 = Math.sqrt(num2);	// 8.xxx
		double dNum3 = Math.sqrt(num3); // 8.xxx
		double dNum4 = Math.sqrt(num4); // 9.0
		
		System.out.println(dNum1);
		System.out.println(dNum2);
		System.out.println(dNum3);
		System.out.println(dNum4);
		
		int num6 = Integer.parseInt(String.valueOf(Math.round(dNum1)));
		int num7 = Integer.parseInt(String.valueOf(Math.round(dNum2)));
		int num8 = Integer.parseInt(String.valueOf(Math.round(dNum3)));
		int num9 = Integer.parseInt(String.valueOf(Math.round(dNum4)));
		
		System.out.println("==================================");
		
		System.out.println(num6);	// 8
		System.out.println(num7);	// 8
		System.out.println(num8);	// 9
		System.out.println(num9);	// 9
	}

}

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€