본문 바로가기
자료구조&알고리즘/구현

[이.코.테] Chapter 04 구현 - 시각 (Java)

by _din 2021. 4. 10.

시각 문제 (교재 113p)

난이도 ●○○ | 풀이 시간 15분 | 시간 제한 2초 | 메모리 제한 128MB 

 

문제

정수 N이 입력되면 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 경우의 수를 구하는 프로그램을 작성하시오.

 

입출력 조건)

입력 조건  - 첫째 줄에 정수 N이 입력진다. (1 ≤ N ≤ 100)
출력 조건  00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수를 출력한다.

입출력 예시)

입력 예시 출력 예시
5 11475

 


문제 풀이 방법

  • 모든 시각의 경우를 하나씩 세서 풀 수 있다.
    • 왜냐하면 하루는 86,400초로 86,400가지밖에 존재하지 않기 대문이다.
    • 경우의 수가 100,000개도 되지 않다.
  • 문자열 연산을 이용해 3이 시각에 포함되어 있는지 확인
  • 완전 탐색 유형이기도 하다.
  • max값을 구해준다.
    • max = 59 + 60*59 + 60*60*n

 

실수한 점 & 부족한 점

  • 문자열 연산이 아닌, 정수 연산을 하려고 하여 복잡하게 생각하였다.
    • 하지만, 정수 연산이 더 빠르다. 시간 계산 방법 링크 참조
      실제로 아래 소스코드를 계산한 결과, 아래와 같이 소요되었다.
      - 문자열 연산은 58ms
      - 정수 연산은 2ms
  • sec를 0초로 두어서 00초 일 때의 경우가 집계되지 않았다.

소스 코드

package exam04_implementation;
import java.io.*;

public class Q2_Time {
    public static int solution(int n){
        int max = 59 + 60*59 + 60*60*n;
        int sec = -1;
        int min = 0;
        int hour = 0;

        int result = 0;
        String str = "";
        for(int temp=0 ; temp <= max ; temp++){
            sec = sec + 1;

            if(sec >= 60){
                min += 1;
                sec = 0;
            }
            if(min >= 60){
                hour += 1;
                min = 0;
            }

            // String으로 풀기
            str = String.valueOf(hour) + String.valueOf(min) + String.valueOf(sec);
            for(int j=0 ; j<str.length() ; j++){
                if(str.charAt(j) == '3'){
                    result++;
                    break;
                }
            }

            // int로 풀기
//            if(sec % 10 == 3 || ((sec - 30) < 10 && (sec - 30) >= 0)){
//                result ++;
//            } else if(min % 10 == 3 || ((min - 30) < 10 && (min - 30) >= 0)) {
//                result++;
//            } else if(hour % 10 == 3 || ((sec - 30) < 10 && (sec - 30) >= 0)) {
//                result++;
//            }
        }

        return result;

    }

    public static void main (String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());

        System.out.println(solution(n));

        br.close();
        bw.close();
    }
}

 


백준 유사한 문제

 

18312번: 시각

정수 N과 K가 입력되었을 때 00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 K가 하나라도 포함되는 모든 시각을 세는 프로그램을 작성하시오. 시각을 셀 때는 디지털 시계를 기준으로,

www.acmicpc.net

package baekjoon.implementation;
import java.io.*;
import java.util.StringTokenizer;

public class Q_18312_Time {
    public static int solution(int n, String k){
        int max = 59 + 60*59 + 60*60*n;
        int sec = -1;
        int min = 0;
        int hour = 0;

        int result = 0;
        String strSec = "";
        String strMin = "";
        String strHour = "";
        String strTime = "";
        for(int temp=0 ; temp <= max ; temp++){
            sec = sec + 1;

            if(sec >= 60){
                min += 1;
                sec = 0;
            }
            if(min >= 60){
                hour += 1;
                min = 0;
            }

            strSec = String.valueOf(sec);
            strMin = String.valueOf(min);
            strHour = String.valueOf(hour);

            if(strSec.length() == 1)
                strSec = "0" + strSec;
            if(strMin.length() == 1)
                strMin = "0" + strMin;
            if(strHour.length() == 1)
                strHour = "0" + strHour;

            strTime = strHour + strMin + strSec;

//            System.out.println(strHour+"시 " + strMin+"분 "+ strSec+"초");

            // String으로 풀기
            for(int j=0 ; j<strTime.length() ; j++){
                if(strTime.charAt(j) == k.charAt(0)){
                    result++;
                    break;
                }
            }

        }

        return result;

    }

    public static void main (String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        String k = st.nextToken();

        System.out.println(solution(n,k));

        br.close();
        bw.close();
    }
}

/** 실수한 부분
 *  1. sec = 0 으로 설정하여 1초부터 시작하게한 것
 *  2. 숫자가 한 자리수 일 때, 앞에 0문자를 붙여주지 않았던 것
 **/

 

반응형

댓글