문제링크: https://www.acmicpc.net/problem/1107
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼��
www.acmicpc.net
문제설명
문제접근
타겟 N을 기준으로 채널을 위아래로 각각 이동하며 숫자 버튼을 눌러서 만들 수 있는지 확인합니다.
이동한 채널이 숫자 버튼만을 눌러서 이동이 가능하다면 채널 N에서 현재 채널까지 이동한 횟수(위아래 버튼을 누른 횟수) + 현재 채널을 숫자버튼을 눌러 이동할 때 필요한 버튼 입력횟수를 더해 반환합니다.
만약 타겟 N에서 시작채널 100 까지 이동했을 경우 |N - 100| 을 반환합니다.
소스코드
package ps.boj;
import java.util.Arrays;
import java.util.Scanner;
/**
* @문제접근
* 타겟에서 위아래로 채널을 증감시키며
* 직접 누를 수 있는지 확인합니다.
* 직접 누를 수 있다면 입력 카운트 + 채널 이동 횟수를 더해 반환합니다.
* 타겟에서 현재 채널(100번) 까지 이동했을 경우 target - 100 을 반환합니다.
*
* @성능
* Runtime: 232 ms
* Memory Usage: 69924 KB
* 시간복잡도: O(N)
*/
public class BOJ_1107_리모컨 {
public static int answer = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int target = sc.nextInt();
sc.nextLine();
int m = sc.nextInt();
sc.nextLine();
boolean[] button = new boolean[10];
Arrays.fill(button, true);
for(int i = 0; i < m; i++)
button[sc.nextInt()] = false;
System.out.println(solve(target, button));
}
public static int solve(int target, boolean[] button){
if(target == 100)
return 0;
int deNum = target, inNum = target;
int totalCnt = 0;
int dCnt, iCnt;
while(deNum != 100 && inNum != 100){
if(deNum > -1) {
dCnt = isDirect(deNum--, button);
if (dCnt > 0) {
return Math.min(totalCnt + dCnt, Math.abs(target - 100));
}
}
iCnt = isDirect(inNum++, button);
if(iCnt > 0){
return Math.min(totalCnt + iCnt, Math.abs(target - 100));
}
totalCnt++;
}
return totalCnt;
}
public static int isDirect(int num, boolean[] button){
int cnt = 0;
String str = Integer.toString(num);
for(int i = 0; i < str.length(); i++){
if(!button[str.charAt(i)-'0'])
return 0;
cnt++;
}
return cnt;
}
}
|
cs |
'알고리즘 문제풀이' 카테고리의 다른 글
[백준 17406] 배열 돌리기4 - Java (0) | 2020.08.18 |
---|---|
[프로그래머스 lv3] 경주로 건설 - Java (0) | 2020.08.17 |
[백준 1182] 부분 수열의 합 - Java (0) | 2020.08.17 |
[LeetCode] PalindromicSubstrings - Java (0) | 2020.08.10 |
[LeetCode] Group Anagrams - Java (0) | 2020.08.10 |