[BOJ 1107] 리모컨 (java)

1 minute read

:pencil2: 문제 링크 https://www.acmicpc.net/problem/1107 :pencil2:

문제풀이

package basics_500;

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

public class BOJ1107 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String str = "";
		// 현재 채널
		int currentChanel = 100;
		// 이동 횟수
		int count = 0;
		int min = 0;
		// 목표 채널
		int goalChanel = Integer.parseInt(br.readLine());
		// 고장난 버튼의 수
		int brokenCount = Integer.parseInt(br.readLine());
		// 고장난 버튼 번호
		boolean[] brokenNum = new boolean[10];
		
		//고장난 번호가 없을때(brokenCount==0)를 제외해주지 않으면 nullPointerException나옴 
		if(brokenCount>0) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			for (int i = 0; i < brokenCount; i++) {
				brokenNum[Integer.parseInt(st.nextToken())] = true;
			}
		}

		// 입력받은 채널이 현재 채널과 같다면 움직일 필요 없음
		if (currentChanel == goalChanel) {
			System.out.println(0);
			return;
		}

		// 입력받은 채널이 현재 채널과 다를때
		/*
		 * 1. +,- 만 사용하기 
		 * 2. 숫자로만 이동 
		 * 3. 고장 안난 버튼이랑 +,- 전부 사용
		 */

		// +, -만 사용하면 절대값을 계산하면 됨
		min = Math.abs(goalChanel - currentChanel);

		//0부터 9를 사용하여 나타날 수 있는 채널의 수 
		for (int j = 0; j <= 999999; j++) {
			str = String.valueOf(j); 

            boolean isBroken = false;

			for (int k = 0; k < str.length(); k++) {
				//숫자중에서 고장난 버튼이 하나라도 있으면 탐색할 필요 없음 
				if(brokenNum[str.charAt(k)-'0']) {
					isBroken = true;
					break;
				}
			}
			//고장난 버튼이 없다면 해당 숫자의 길이와(str.length())+ 목표채널과의 차(+,-)로 조합 가능함 
			if(!isBroken) {
				count = Math.abs(goalChanel - j) + str.length();
				min = count > min ? min : count;
			}

		}
		System.out.println(min);

	}

}

Comments