회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
2
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
전체
공지
자유
질문
오타/오역/요청
게시판 공지
홍보
업데이트
solved.ac
글쓰기
질문 도움말
자주묻는 질문
1107번 질문입니다. 도와주세요ㅠㅠ
1107번 - 리모컨
ye0823
8년 전
0
틀린 케이스를 못찾겠네요ㅠㅠ 혹시 푸신 분들 있으시면 안될거 같은 케이스좀 제시해주실 수 있으신가요??ㅠㅠ
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { public static ArrayList<Integer> remoteControl = new ArrayList<Integer>(); public static String dest_channel = ""; public static StringBuffer minusValue = new StringBuffer(); public static StringBuffer plusValue = new StringBuffer(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); dest_channel = br.readLine(); int length = dest_channel.length(); int breakChannelNum = Integer.parseInt(br.readLine()); // 리모콘 안에 0부터 9까지 숫자 넣어놓기 for (int i = 0; i <= 9; i++) { remoteControl.add(i); } StringTokenizer st = new StringTokenizer(br.readLine()); // 리모콘 안에 고장난 숫자 제거 for (int i = 0; i < breakChannelNum; i++) { remoteControl.remove(new Integer(Integer.parseInt(st.nextToken()))); } br.close(); if (dest_channel.equals("100")) { System.out.println(0); return; } // 1. 하나씩 눌러서 이동할 때 값 구하기 int plusMinusButtonClick = Math .abs(Integer.parseInt(dest_channel) - 100); // 2. 목적지보다 작은 값 중 목적지와 가장 가까운 값 구하기 minusApproximate(dest_channel, length); // 3. 목적지보다 큰 값 중 목적지와 가장 가까운 값 구하기 plusApproximate(dest_channel, length); int minusApproximateValue = 0; if (minusValue.length() != 0) { //자릿수만큼 숫자버튼 클릭 + '+'버튼 클릭횟수 minusApproximateValue = minusValue.length() + (Integer.parseInt(dest_channel) - Integer .parseInt(minusValue.toString())); } else { // 작은 근사값이 없으면 값을 500001로 설정해서 가장 크게 해놓기 minusApproximateValue = 500001; } int plusApproximateValue = 0; if (plusValue.length() != 0) {//자릿수만큼 숫자버튼 클릭 + '-'버튼 클릭횟수 plusApproximateValue = plusValue.length() + (Integer.parseInt(plusValue.toString()) - Integer .parseInt(dest_channel)); } else {// 작은 근사값이 없으면 값을 500001로 설정해서 가장 크게 해놓기 plusApproximateValue = 500001; } // 3가지 경우 중 가장 작은 수 출력 int value = plusMinusButtonClick < minusApproximateValue ? plusMinusButtonClick : minusApproximateValue; value = value < plusApproximateValue ? value : plusApproximateValue; System.out.println(minusValue.toString() + " " + plusValue.toString()); System.out.println(plusMinusButtonClick + " " + minusApproximateValue + " " + plusApproximateValue); System.out.println(value); } // 목적지보다 작은 값 중 가장 가까운 값 구하기 public static void minusApproximate(String dest_channel, int length) { minusValue.setLength(0); first: for (int i = 0; i < length; i++) { int tempNum = Integer.parseInt("" + dest_channel.charAt(i)); // 리모콘에 수가 있으면 그대로 포함 if (remoteControl.contains(tempNum)) { minusValue.append(tempNum); } else { // 리모콘에 수가 없으면 가장 가까운 작은 값을 찾아 넣고, 나머지를 리모콘에서 가장 큰 값으로 채움 for (int j = 0; j <= tempNum; j++) { if (remoteControl.contains(tempNum - j)) { minusValue.append(tempNum - j); while (minusValue.length() < length) { minusValue.append(remoteControl.get(remoteControl .size() - 1)); } break first; } } // 목적채널의 자리수와 구해진 근사값의 자리수가 다를 경우 if (minusValue.length() != length) { minusApproximateValueDown(dest_channel, length); break first; } } } } // 목적채널의 자리수와 구해진 근사값의 자리수가 다를 경우, // 수를 다운시켜서 다시 돌리고, 그래도 없으면 자리수를 다운시켜 다시 돌리고, // 그러다 자리수가 0이 될때까지 나오지 않으면 최대값 500001로 세팅 public static void minusApproximateValueDown(String dest_channel, int length) { if (length == 0) { minusValue.append(500001); } else if (minusValue.length() == 0) { // 자릿수 다운시키기 length--; dest_channel = dest_channel.substring(1); minusApproximate(dest_channel, length); } else { int tempNum = Integer.parseInt(""+minusValue.charAt(minusValue.length() - 1)) - 1; minusValue.deleteCharAt(minusValue.length() - 1); for (int i = 0; i <= tempNum; i++) { if (remoteControl.contains(tempNum - i)) { minusValue.append(tempNum - i); while (minusValue.length() < length) { minusValue.append(remoteControl.get(remoteControl .size() - 1)); } break; } } if (minusValue.length() != length) { minusApproximateValueDown(dest_channel, length); } } } //목적지보다 큰 값 중 가장 가까운 값 구하기 public static void plusApproximate(String dest_channel, int length) { plusValue.setLength(0); first: for (int i = 0; i < length; i++) { int tempNum = Integer.parseInt("" + dest_channel.charAt(i)); // 리모콘에 수가 있으면 그대로 포함 if (remoteControl.contains(tempNum) && (tempNum!=0 || i!=0)) { plusValue.append(tempNum); } else { // 리모콘에 수가 없으면 가장 가까운 큰 값을 찾아 넣고, 나머지를 리모콘에서 가장 작은 값으로 채움 for (int j = 1; j <= 9 - tempNum; j++) { if (remoteControl.contains(tempNum + j)) { plusValue.append(tempNum + j); while (plusValue.length() < length) { plusValue.append(remoteControl.get(0)); } break first; } } // 목적채널의 자리수와 구해진 근사값의 자리수가 다를 경우 if (plusValue.length() != length) { plusApproximateValueUp(dest_channel, length); break first; } } } } // 목적채널의 자리수와 구해진 근사값의 자리수가 다를 경우, // 수를 업시켜서 다시 돌리고, 그래도 없으면 자리수를 업시켜 다시 돌리고, // 그러다 자리수가 7이 될때까지 나오지 않으면 최대값 500001로 세팅 public static void plusApproximateValueUp(String dest_channel, int length) { if (length == 7) { plusValue.append(500001); } else if (plusValue.length() == 0) { // 자릿수 업시키기 length++; dest_channel = "0" + dest_channel; plusApproximate(dest_channel, length); } else { int tempNum = Integer.parseInt(""+plusValue.charAt(plusValue.length() - 1)); plusValue.deleteCharAt(plusValue.length() - 1); for (int i = 1; i <= 9 - tempNum; i++) { if (remoteControl.contains(tempNum + i)) { plusValue.append(tempNum + i); while (plusValue.length() < length) { plusValue.append(remoteControl.get(0)); } break; } } if (plusValue.length() != length) { plusApproximateValueUp(dest_channel, length); } } } }
댓글을 작성하려면
로그인
해야 합니다.
ye0823 8년 전
틀린 케이스를 못찾겠네요ㅠㅠ 혹시 푸신 분들 있으시면 안될거 같은 케이스좀 제시해주실 수 있으신가요??ㅠㅠ