본문 바로가기
코딩/백준-자바

[자바] 1107번: 리모컨

by 철없는민물장어 2023. 1. 1.
728x90
반응형

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

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net


고장나지 않은 버튼들을 이용해서 채널N에 가장 근접한 채널을 찾아서..풀려고 했다.

N보다 크거나 같은 수로 접근하는 것 하나, N보다 작거나 같은 수로 접근하는 것 하나씩 만들어서

두 경우를 비교하려고 했다.

숫자를 한 자릿수씩 끊어서, 그 숫자에 해당하는 버튼이 고장났다면 숫자를 1 올려보고.. 이런식으로 만들려 했는데..

너무나도 고려할 부분이 많았다.

(버튼 9를 쓰지 못하는 경우에 더 큰 수로 접근하려면 자릿수를 하나 올려야하는데.. 9에서 10이 되면 1과0버튼 두개를 고려해야하고... 너무 골치아프다)

(버튼 0을 못 쓸 때 더 작은 수를 만드는 것도 마찬가지로 내가 할 수가 없음...)

 

 

한참을 헤매다 결국 검색해보고 

브루트포스로 풀었다는 사람들의 글을 읽고 참고 한 후

다시 혼자 작성했다.

.

.

 

1부터 100만까지의 수를 

버튼으로 만들 수 있는 수라면 해당 경우의 카운트를 세고

버튼이 고장나서 만들 수 없다면 해당 경우는 넘긴다.

 

이렇게 모든 경우의 수를 싹~ 다 조사해서 가장 작은 카운트의 값을 결과로 내보낸다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class P1107 {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		// String n=br.readLine();

		int m = Integer.parseInt(br.readLine());
		HashSet<Integer> broken = new HashSet<>();

		if (m != 0) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			while (st.hasMoreTokens()) {
				broken.add(Integer.parseInt(st.nextToken()));
			}
		}

		int result = Math.abs(n - 100);
		for (int i = 0; i < 1000000; i++) {

			int count = 0;

			if ((count = check(i, broken)) != -1) {
				count += Math.abs(i - n);
				result = Math.min(result, count);
			} else
				continue;

		}

		System.out.println(result);

	}

	static int check(int n, HashSet<Integer> broken) {
		String num = Integer.toString(n);
		boolean canMake = true;
		for (int i = 0; i < num.length(); i++) {
			if (broken.contains(num.charAt(i) - '0')) {
				canMake = false;
				break;
			}
		}

		if (canMake == true) {
			return num.length();
		} else
			return -1;
	}

}

 

  • 값 비교(min, max 등) 지수계산, 로그계산 등에 Math클래스를 사용할 수 있다.
  • Integer.toString(num)으로 숫자를 문자열로 바꿀 수 있다
  • 문자열로 변환한 숫자는 stringNum.length()로 숫자의 길이를 구할 수 있다.
  • stringNum.charAt(i)-'0' 으로 i번째 자릿수의 숫자를 int형으로 구할 수 있다.
728x90
반응형

댓글