백준 10162 전자레인지

Eunkyung·2021년 12월 31일
0

Algorithm

목록 보기
30/30

https://www.acmicpc.net/problem/10162

문제해결

문제 풀기 전 데이터 유형과 길이를 확인하고 조건을 다시 한 번 확인한다.
해당 문제의 데이터 유형은 정수로 10,000보다 작은 자연수이다. 구하고자 하는 것은 요리시간 T를 맞추기 위한 최소 버튼 조작 횟수로 A, B, C의 최소 버튼 횟수를 출력하는 것이다. 이 때 3개의 버튼으로 T를 맞출 수 없으면 -1을 출력한다.

첫 번째 풀이는 while문으로 t가 0이 아닐 때까지 반복하다가 t가 c보다 작은 경우 3개의 버튼으로 T를 맞출 수 없어 break문으로 반복문을 탈출하였다. 총 3개의 서브 태스크가 있었는데 첫 번째 내 풀이는 30점이었다. ㅋㅋㅋㅋㅋ

첫 번째 소스코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        int a = 300;
        int b = 60;
        int c = 10;
        int countA = 0;
        int countB = 0;
        int countC = 0;
        while (t != 0) {
            if (t >= a) {
                t -= a;
                countA++;
            }
            if (t >= b) {
                t -= b;
                countB++;
            }
            if (t >= c) {
                t -= c;
                countC++;
            } else {
                break;
            }
        }
        if (t == 0) {
            System.out.println(countA + " " + countB + " " + countC);
        } else {
            System.out.println(-1);
        }
    }
}

더 좋은 풀이를 찾아보다가 while문에서 t가 c보다 크거나 같을 때까지만 반복하고 그렇지 않으면 반복문을 탈출하는 풀이를 발견하였다. 게다가 삼항 연산자까지 사용해서 내 첫 번째 코드보다 훨씬 깔끔했다. (자주 안쓰다보니 생각이 잘 안난다.)

두 번째 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        int a = 300;
        int b = 60;
        int c = 10;
        int countA = 0;
        int countB = 0;
        int countC = 0;
        while (t >= c) { // t가 c보다 작은 경우 반복문 종료
            if (t >= a) {
                t -= a;
                countA++;
            } else if (t >= b) {
                t -= b;
                countB++;
            } else if (t >= c) {
                t -= c;
                countC++;
            }
        }
        System.out.println(t == 0 ? countA + " " + countB + " " + countC : -1);
    }
}

또 다른 풀이를 찾아봤다. 단순하게 t에서 빼는 것만 생각했는데 나눗셈으로 구하는 방법도 있었다! 도대체 이런 풀이는 어떻게 생각하는거죠?

세 번째 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        int a = 300;
        int b = 60;
        int c = 10;
        int countA = 0;
        int countB = 0;
        int countC = 0;
        if (t % c != 0) { // a,b,c의 합으로 t를 구할 수 없는 경우
            System.out.println(-1);
        } else {
            countA = t / a; // 몫은 카운트
            t %= a; // 나머지는 빼는 것보다 효율적임
            countB = t / b;
            t %= b;
            countC = t / c;
            System.out.printf("%d %d %d", countA, countB, countC);
        }
    }
}

당연히 빼기 연산보다 나눗셈 연산이 효율적이라고 생각했는데 메모리도 그렇고 시간도 오래 걸렸다. 백준 서버 시간인가

profile
꾸준히 하자

0개의 댓글