알고리즘
백준 24390번 또 전자레인지야? (JAVA)
박카스마시며코딩
2023. 3. 17. 20:07
https://www.acmicpc.net/problem/24390
24390번: 또 전자레인지야?
첫 줄에 잇창명이 원하는 조리시간이 M:S 형태로 주어진다(0 ≤ M ≤ 60, 0 ≤ S ≤ 59). M은 분, S는 초이며, 항상 두 자리 숫자로 주어진다. 조리시간은 10초 이상 60분(3600초) 이하이며, 항상 10의 배수
www.acmicpc.net
package BOJ.bfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.function.Function;
public class BOJ_24390 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String command = br.readLine();
String[] temp = command.split(":");
Function<String,Integer> stoi = Integer::parseInt;
int min = stoi.apply(temp[0]);
int sec = stoi.apply(temp[1]);
sec += min * 60;
int result = cal(sec);
System.out.println(result);
}
private static final int[] BUTTON = {10,60,600,30};
private static int cal(int sec) {
if(sec == 30){
return 1;
}
Queue<Integer> q = new LinkedList<>();
q.offer(0);
Set<Integer> visited = new HashSet<>();
int time = 0;
while(!q.isEmpty()){
int size = q.size();
for(int s = 0 ; s < size ; s++){
int now = q.poll();
if(now/10 == sec){
if(now % 10 == 1){
return time;
}else{
return time+1;
}
}
for(int i = 0 ; i < 4 ; i++){
int next = now + 10 * BUTTON[i];
if(i == 3 && next % 10 == 0){
next += 1;
}
if(!visited.contains(next) && next/10 <= sec){
q.offer(next);
visited.add(next);
}
}
}
time++;
}
return -1;
}
}