[백준] 24390 또 전자레인지야?.Java

조청유과·2023년 5월 12일
0

BOJ

목록 보기
19/128

문제

잇창명의 집에는 오래된 전자레인지가 있다. 백준 온라인 저지에서 문제를 너무 많이 푼 잇창명은 문득 이런 궁금증이 생기기 시작했다.

버튼을 최소 몇 번 눌러야 조리시간 2분을 맞출 수 있을까?

잇창명의 전자레인지에는 다음과 같이 버튼이 4개 있고, 각 버튼을 누르면 다음과 같이 작동한다. 초기 상태에는 조리시간이 0초이고, 조리 중이 아니며, 조리시작 버튼을 눌러야 조리가 시작된다.

  • 10초: 조리시간이 10초 늘어난다.
  • 1분: 조리시간이 1분(60초) 늘어난다.
  • 10분: 조리시간이 10분(600초) 늘어난다.
  • 조리시작
    - 조리 중이 아닐 때: 조리가 시작된다. 만약에 조리시간이 0초였다면 30초로 늘어난다.
    - 조리 중일 때: 조리시간이 30초 늘어난다.
  • 모든 버튼은 조리 중인지의 여부와 무관하게 항상 누를 수 있으며, 별도의 언급이 없을 경우 항상 같은 동작을 한다.

예를 들어 이 전자레인지로 2분을 맞추려면 조리시작 버튼을 4번 누르면 되지만, 최적의 방법은 아니다. 그 대신 1분-1분-조리시작 순서로 버튼을 누르면 버튼을 누른 횟수가 3번이 되어 최적이다. 1분-1분의 경우에는 조리가 되지 않기 때문에 최적이 아니다. 실제로는 조리 중에는 남은 조리시간이 계속 줄어들고 중간에 조리를 취소할 수 있지만, 이 문제에서는 생각하지 않기로 한다.

잇창명은 지난 한 학기 동안 전자레인지를 이용할 때마다 매번 문제로 내고 싶은 마음이 들어서 괴로워하고 있다. 잇창명을 도와주자!

입력

첫 줄에 잇창명이 원하는 조리시간이 M:S 형태로 주어진다(0 ≤ M ≤ 60, 0 ≤ S ≤ 59). M은 분, S는 초이며, 항상 두 자리 숫자로 주어진다.

조리시간은 10초 이상 60분(3600초) 이하이며, 항상 10의 배수이다.

출력

주어진 조리시간을 맞추기 위해 버튼을 눌러야 하는 최소 횟수를 출력한다.

답안제출

1.

import java.io.*;
public class Main  {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(":");
        int M = Integer.parseInt(str[0]);
        int S = Integer.parseInt(str[1]);
       int cnt = 1;
       cnt += (M/10 + M%10); // 10분, 1분 단위로 있어서 나눠지면 10분단위, 아니면 1분 단위로 카운팅.
       if (S < 30) {
           cnt += S/10;
       }
       if (S >= 30) {
           cnt += (S-30)/10;
       }
       System.out.println(cnt);

    }
}
  • 분, 초를 따로 취급해서 카운팅한 방식.
  • 어자피 조리시작 or 30초 시작을 해야하기 때문에 cnt를 0이 아닌 1로 시작.

2.

import java.io.*;
public class Main  {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(":");
        int M = Integer.parseInt(str[0]);
        int S = Integer.parseInt(str[1]);
       S += M*60;
       if (S == 0) {
           System.out.println(0);
           return ;
       }
       if (S < 30) {
           System.out.println(S/10 + 1);
           return ;
       }
       if (S < 60) {
           System.out.println((S-30)/10 + 1);
           return ;
       }
       int S2 = S;
       int ss, sm=1;
       S -= 30; ss = 1;
       ss += S/600; S %= 600;
       ss += S/60; S %= 60;
       ss += S/30; S %= 30;
       ss += S/10;
       
    sm += S2/600; S2 %= 600;
    sm += S2/60; S2 %= 60;
    sm += S2/30; S2 %= 30;
    sm += S2/10;
    System.out.println(Math.min(ss, sm));

    }
}
  • 전부 초단위로 변경해서 푼 방식.
  • S가 60 미만일 때 경우를 따로 처리.
  • 시간을 쌓고 조리시작, 30초 시작 후 시간 쌓기 2가지 방식으로 나눠서 버튼 최솟값을 출력.

0개의 댓글

관련 채용 정보