본문 바로가기
백준

[백준] code.plus(브루트포스,JAVA)1107번, 리모컨

by 열정적인 이찬형 2022. 3. 4.

문제 링크

 

1107번: 리모컨

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

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

브루트 포스란.

모든 경우의 수를 대입시켜서 가장 알맞은 경우의 수를 결과로 출력하는 것입니다.

 

이 문제는 기본 채널 100에서 +, -를 눌렀을 때 수와 각 채널이 선택되었을 때를 기준으로 목표 채널까지 몇 번 클릭하는 경우의 수를 모두 구해서 그 중 최소값을 출력하도록 하였습니다.

 

기본 채널이 100이라는 것이 핵심으로 볼 수 있습니다.

 

문제에 해결알고리즘은

1. 기본채널에서 목표채널까지 +, - 만 눌렀을 때 클릭 수를 구합니다.

2. 채널은 0~999999까지 가능하므로 각 채널을 기준으로 +, - 만 눌렀을 때 목표채널까지의 클릭 수를 구합니다.

3. 위 과정을 반복하여 목표채널까지의 리모컨 최소 클릭 수를 구하여 결과로 출력해줍니다.

 

※채널 범위는 0≤ channel ≤ 500000이지만 리모컨 버튼으로 최대 만들 수 있는 수는 999999까지 만들 수 있으므로 0~999999채널을 기준으로 브루트포스를 진행하였습니다.※ 기본채널에서 목표채널까지 +, -만 눌렀을 때에는 |목표채널 - 100|을 하면 구할 수 있습니다.

  • BufferedReader를 사용하여 입력 값을 num,size를 저장하였습니다.
  • size가 0이 아니면 StringToknizer을 이용하여 고장난 버튼을 띄어쓰기 기준 나누어서 저장하였습니다.
  • 최소 클릭수 계산하는 minClick함수를 만들었습니다.
  • BufferedWriter에 함수 실행한 결과인 최수 클릭 수를 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.
  • minClick은 기본 채널에서 목표채널의 +, -만 눌렀을 때 클릭 수와 0~999999채널 기준으로 +, -만 눌렀을 때 클릭 수의 경우의 수를 모두 비교하여 최소값을 반환하도록 하였습니다.

 

결과 코드

import java.io.*;
import java.util.*;
public class Main{
	static boolean[] button = new boolean[10];	//버튼 클릭 확인 배열
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //입력값 처리하는 BufferedReader
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //결과값 출력하는 BufferedWriter
        //-----입력값 저장-------
        int num  =Integer.parseInt(br.readLine());
        int size = Integer.parseInt(br.readLine());
        if(size!=0) {	//고장난 버튼 있을시
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            for(int i=0;i<size;i++) {
            	int temp = Integer.parseInt(st.nextToken());
            	button[temp] = true;	//고장난 버튼 초기화
            }
        }	
        //-----함수 실행 및 결과 출력-------
        bw.write(minClick(num) + "\n");
        bw.flush();
        bw.close();
        br.close();
    }
    //------리모컨 최소 클릭 구하는 함수---------
    public static int minClick(int num) {
    	int result = Math.abs(num-100);		//기본채널에서 +,-만 눌렀을 때
        //채널 0~999999 선택시 클릭 횟수
    	for(int i=0;i<=999999;i++) {	
    		String temp = String.valueOf(i);
    		int len = temp.length();
			boolean check = true;
    		for(int j=0;j<len;j++) {
    			int n = Character.getNumericValue(temp.charAt(j));
    			if(button[n]) {	//선택 불가능한 채널일 때
    				check = false;
    				break;
    			}
    		}
            	//채널 클릭 수 비교
    		if(check) {
    			result = Math.min(result, Math.abs(num-i) + len);
    		}
    	}
    	return result;
    }

}

댓글