문제 링크
주의사항
- 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;
}
}
'백준' 카테고리의 다른 글
[백준] code.plus(브루트포스,JAVA)14500번, 테트로미노 (0) | 2022.03.06 |
---|---|
[백준] 단계별로 풀어보기(단계:22,우선순위 큐,JAVA)11279번, 최대 힙 (0) | 2022.03.06 |
[백준] 단계별로 풀어보기(단계:21,이분 탐색,JAVA)12015번, 가장 긴 증가하는 부분 수열 2 (0) | 2022.03.03 |
[백준] code.plus(브루트포스,JAVA)1476번, 날짜 계산 (0) | 2022.03.02 |
[백준] 단계별로 풀어보기(단계:21,이분 탐색,JAVA)1300번, K번째 수 (0) | 2022.03.01 |
댓글