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

[λ°±μ€€] 1065번: ν•œμˆ˜(완전탐색, brute force)

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

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

 

1065번: ν•œμˆ˜

μ–΄λ–€ μ–‘μ˜ μ •μˆ˜ X의 μžλ¦¬μˆ˜κ°€ λ“±μ°¨μˆ˜μ—΄μ„ 이룬닀면, κ·Έ 수λ₯Ό ν•œμˆ˜λΌκ³  ν•œλ‹€. λ“±μ°¨μˆ˜μ—΄μ€ μ—°μ†λœ 두 개의 수의 차이가 μΌμ •ν•œ μˆ˜μ—΄μ„ λ§ν•œλ‹€. N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , N보닀 μž‘κ±°λ‚˜ 같은 ν•œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 

www.acmicpc.net

μ½”λ“œ

import java.util.Scanner;

public class Main {
	public static boolean check(int num) {
		boolean flag = false;
		String str = Integer.toString(num);
		int first = str.charAt(0) - '0';// 백의자리
		int mid = str.charAt(1) - '0';	// μ‹­μ˜μžλ¦¬
		int last = str.charAt(2) - '0';	// 일의자리
		if((first + last) == (mid * 2)) {
			flag = true;
		}
		return flag;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		int count = 0;
		if(N<100) {
			count = N;
		}
		else if(N>100 && N<=110){
			count = 99;
		}
		else {
			count += 99;
			for(int i=111; i<=N; i++) {
				if(check(i))
					count ++;
			}
		}
		
		System.out.println(count);
		scan.close();
	}
}

풀이

주어진 숫자의 각 μžλ¦¬κ°€ λ“±μ°¨μˆ˜μ—΄μΈμ§€ ν™•μΈν•˜λŠ” 문제,

μ •μˆ˜ X의 μžλ¦¬μˆ˜κ°€ λ“±μ°¨μˆ˜μ—΄μ„ μ΄λ£¬λ‹€λŠ”κ²Œ λ­”λœ»μΈμ§€ λͺ°λΌμ„œ ν•œμ°Έμ„ μ‚΄νŽ΄λ΄€λ‹€ ...

 

예λ₯Όλ“€μ–΄, 123인 경우 -> +1 인 λ“±μ°¨μˆ˜μ—΄μ΄λ‹€.

135인 경우 -> +2인 λ“±μ°¨μˆ˜μ—΄μ΄λ‹€.

126인 경우 -> λ“±μ°¨μˆ˜μ—΄μ΄ μ•„λ‹ˆλ‹€.

100 미만의 μˆ«μžλŠ” μ „λΆ€ λ“±μ°¨μˆ˜μ—΄μ΄λ‹€. (1 ~ 99κΉŒμ§€λŠ” μ „λΆ€ λ“±μ°¨μˆ˜μ—΄)

그리고, 100λΆ€ν„° 110κΉŒμ§€λŠ” μ „λΆ€ λ“±μ°¨μˆ˜μ—΄μ΄ μ•„λ‹ˆκ³ ,

111λΆ€ν„°λŠ” λ“±μ°¨μˆ˜μ—΄μΈμ§€ μ•„λ‹Œμ§€ νŒλ‹¨ν•΄μ€˜μ•Ό ν•œλ‹€.

λ”°λΌμ„œ N이 100λ―Έλ§ŒμΌλ•Œ, 100~110μΌλ•Œ, 110보닀 클 λ•Œ 총 3κ°€μ§€μ˜ μΌ€μ΄μŠ€λ‘œ λ‚˜λˆ„μ—ˆλ‹€.

 

λ“±μ°¨μˆ˜μ—΄μΈμ§€ ν™•μΈν•˜λŠ” 방법은 주어진 숫자의 μžλ¦¬μ€‘ 첫번째, μ„Έλ²ˆμ§Έμ˜ 합이 λ‘λ²ˆμ§Έ 숫자의 2λ°°κ°€ 되면 λœλ‹€.

 

123 => (1+3) = (2*2) μ΄λ―€λ‘œ λ“±μ°¨μˆ˜μ—΄,

357 => (3+7) = (5*2) μ΄λ―€λ‘œ λ“±μ°¨μˆ˜μ—΄,

531 => (5+1) = (3*2) μ΄λ―€λ‘œ λ“±μ°¨μˆ˜μ—΄μ΄λ‹€.

 

λ”°λΌμ„œ 각 μžλ¦Ώμˆ˜κ°€ λ“±μ°¨μˆ˜μ—΄μΈμ§€ μ•„λ‹Œμ§€ νŒλ‹¨ν•˜λŠ” λ©”μ†Œλ“œ check()λ₯Ό κ΅¬ν˜„ν•΄, λ“±μ°¨μˆ˜μ—΄μΌκ²½μš° ++λ₯Ό ν•΄μ£Όλ©΄ λœλ‹€.

 

* boolean check() λ©”μ†Œλ“œ

check λ©”μ†Œλ“œμ—μ„œλŠ”, 주어진 μ •μˆ˜λ₯Ό 각 자릿수λ₯Ό μ‰½κ²Œ κ΅¬ν•˜κΈ° μœ„ν•΄ String λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν–ˆλ‹€.

κ·Έ ν›„ 각 μžλ¦Ώμˆ˜μ—μ„œ '0'을 λΉΌμ£Όλ©΄ 각 자릿수의 값이 λœλ‹€.

κ·Έ ν›„ 첫번째 + μ„Έλ²ˆμ§Έμ˜ 값이 λ‘λ²ˆμ§Έ*2κ°€ 되면 λ“±μ°¨μˆ˜μ—΄μ΄λ―€λ‘œ, flagλ₯Ό true둜 μ €μž₯ν•œλ‹€.

 

 

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€