코딩테스트

BOJ : 4796

joonwoong 2024. 5. 22. 00:18

💡문제 분석 요약

총 휴가가 V이고 P일 중 연속으로 캠핑장 사용할 수 있는 날이 L이니까 공식을 유추해서 풀어낼 수 있을 거라고 생각하고 다른 예시도 들어보면서 공식을 찾았음.

💡알고리즘 설계

  1. L,P,V를 우선 입력받는다.
  2. 세개의 값이 모두 0일 경우 break한다.
  3. V를 P로 나누었을때 몫으로 나온 값에 연속으로 캠핑가능한 날짜인 L을 곱해서 result에 저장한다.
  4. V를 P로 나눈 후 남은 나머지 값을 L과 비교하여 작은 값을 result에 더해준다.
  5. result 값을 출력해준다.

💡코드

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

public class Q4796_boj {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st ;
        int TC =1;

        while(true){
            st = new StringTokenizer(br.readLine());
            int L = Integer.parseInt(st.nextToken());
            int P = Integer.parseInt(st.nextToken());
            int V = Integer.parseInt(st.nextToken());
            int result = 0;

            if(L==0 && P==0 && V==0) break;

            result = V/P *L;

            if(L>=V%P) {
                result += V % P;
            }else{
                result += L;
            }

            System.out.println("Case "+ TC +": " + result);
            TC++;
        }
    }
}

💡시간복잡도

O(N)

입력받은 N만큼만 연산함

💡 틀린 이유

한 번에 통과했습니다

💡 틀린 부분 수정 or 다른 풀이

  • 다른 풀이stringBuilder와 Math메서드를 통해 수 비교를 한 것을 보니 훨씬 간단해진 것 같다. 흠.. 나도 할 수 있는데 왜 안했을까?
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int i = 1;
        while (true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int l = Integer.parseInt(st.nextToken());
            int p = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            if (l == 0 && p == 0 && v == 0) break;
            int total = l * (v / p) + Math.min(l, v % p);
            sb.append("Case " + i + ": " + total + "\n");
            i++;
        }
        System.out.print(sb);
    }
}

💡 느낀점 or 기억할정보

문제 자체는 쉬운데 stringbuilder을 활용해야겠다고 생각했고, 작은수 비교를 위해 if문 5줄을 적었지만 Math 메소드 사용하면 한줄로 끝나는 것을 보니 매우 간결해보인다. 나도 다음번엔 저거 사용할거다.

'코딩테스트' 카테고리의 다른 글

BOJ : 12845  (0) 2024.05.22
BOJ : 2217  (0) 2024.05.22
BOJ : 11899  (0) 2024.04.05
BOJ : 10799  (0) 2024.04.05
BOJ : 28278  (0) 2024.04.05