본문 바로가기
알고리즘/백준

[Java] BOJ 1107번 리모컨

by 컴공맨 2021. 6. 16.
 

1107번: 리모컨

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

www.acmicpc.net


풀이

버튼을 누를 수 있는 모든 경우를 조사하여 해결했습니다.

주의할점은 고장난 버튼의 수가 0일 경우 고장난 버튼들의 번호는 입력이 아예 주어지지 않습니다.

자세한 내용은 코드에 주석을 참고해주세요.


코드

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

public class Main {
	public static int N, M;
	// 고장난 버튼은 true
	public static boolean[] buttons;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		N = Integer.parseInt(br.readLine());
		M = Integer.parseInt(br.readLine());
		
		buttons = new boolean[11];
		
		// M이 0인 경우 고장난 버튼들의 입력은 아예 주어지지않아 NullPointer 예외가 발생함을 주의
		if (M > 0) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int i = 0; i < M; ++i) {
				buttons[Integer.parseInt(st.nextToken())] = true;
			}			
		}
		
		// 시작 번호는 100이므로 가고 싶은 채널에서 100을 빼면 +, - 버튼만으로
		// N번 채널까지 가는 최대 횟수가 된다.
		int answer = Math.abs(N - 100);
		
		// 0 ~ 500000 ~ 0으로 +, -를 누르는 모든 경우의수를 탐색한다.
		for (int i = 0; i <= 1000000; ++i) {
			// 이동하고자 하는 채널
			int channel = i;
			
			int moveCnt = moveChannel(channel);
			
			// 채널의 모든 숫자에 해당하는 버튼을 누를 수 있어서 해당 채널로 이동했다면
			if (moveCnt > 0) {
				// 이동한 채널인 channel에서 이동하고자하는 채널인 N까지
				// +, - 버튼만으로 이동하는 횟수
				int pressCnt = Math.abs(channel - N);
				
				int totalCnt = moveCnt + pressCnt;
				
				// 임의의 채널로 옮기고 +, - 버튼만으로 움직인 횟수 중 작은 횟수로 갱신
				answer = (answer > totalCnt) ? totalCnt : answer;
			}
		}
		
		System.out.println(answer);
	}
	
	// 채널에 해당하는 버튼을 누를 수 있는지 확인하고 누를 수 있다면 해당 채널로 이동하면서
	// 누른 버튼의 횟수를 반환
	public static int moveChannel(int channel) {
		// 채널이 0번이고
		if (channel == 0) {
			// 고장난 버튼이라면
			if (buttons[0]) {
				// 0은 누를 수 없으므로 0반환
				return 0;
			}
			else { // 고장난 버튼이 아니라면
				return 1;
			}
		}
		
		int cnt = 0;

		// 채널이 0보다 클 때만,
		while (channel > 0) {
			// 채널의 맨 마지막 수에 해당하는 버튼이 고장났다면
			if (buttons[channel % 10]) {
				// 해당 채널은 누를 수 없으므로 0 반환
				return 0;
			}
			
			// 고장나지 않았다면 버튼을 누를 수 있으므로 +1
			cnt += 1;
			
			// 누른 맨 마지막 버튼은 제거
			channel /= 10;
		}
		
		// 누를 수 있는 채널이므로 해당 채널을 누른 횟수를 반환
		return cnt;
	}
}

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

 

'알고리즘 > 백준' 카테고리의 다른 글

[Java] BOJ 5014번 스타트링크  (0) 2021.06.18
[Java] BOJ 2225번 합분해  (0) 2021.06.17
[Java] BOJ 1915번 가장 큰 정사각형  (0) 2021.06.15
[Java] BOJ 17135번 캐슬 디펜스  (0) 2021.06.14
[Java] BOJ 1946번 신입 사원  (0) 2021.06.14