coding test

문자열 - 백준_13223_소금폭탄

ron_nie 2024. 3. 6. 19:44
728x90

13223번: 소금 폭탄

문제 해석

소금팔에 시간을 입력해야함.

첫째줄에는 현재시각이 나오고 둘째줄에는 소금 투하시간이 나옴

즉 두 시간의 차이를 구하는 문제임

예시

20시와 04시의 시간 차이는 8시간

12:34:56 과 14:36:22 시간차이는 2시간 1분 26초 차이

접근법

  1. 시간을 입력받는다
    1. : 문자를 기준으로 시간, 분, 초를 쪼갠다.
  2. 입력받은 두개의 시간을 비교한다.
    1. 두개의 시간, 분, 초의 차이를 비교한다
  3. 구해진 시간을 HH:MM:SS 형태로 출력한다

1. 시간을 입력받는다

일단 시간을 쪼개는거부터 난관인데 몇가지 방법이 있을 것 같다. 일단 “:” 가 포함되어 있기 때문에 무조건 문자로 받아야한다. 그 다음 세가지 방법이 있다.

  1. 그냥 냅다 반복문을 돈다.
  2. subString() 함수를 사용하여 원하는곳의 문자열을 떼어낸 후 다시 숫자로 치환한다.
  3. split() 함수를 사용한다.

2. 입력받은 두개의 시간을 비교한다.

투하시각에서 현재 시각을 빼면 되는데. 몇가지 주의할 점이 존재한다

  1. 투하시각이 날이 바뀌고 나서라면?
  2. 시간이 음수가 나오면??

예를들어 현재 시각은 20시인데 투하시각이 04시인 경우이다. 4- 20 = ??? 역시 시간은 음수라면 안된다. 이것을 처리해줘야한다.

단위가 전부 섞여있을 때 계산하는 방법은 가장 작은 단위로 바꾼 후 계산하면 된다.

3. 구해진 시간을 HH:MM:SS 형태로 출력한다

예를들어서 1만초가 있다고 가정하자. 1만초는 몇시 몇분 몇초일까??

3600초 * 2시간 + 2800초 즉 2시간하고 2800초가 더 남는다. 이때 2시간은 어떻게 구한걸까? 당연히 1만초에서 3600초를 나눈 몫이 될것이다.

다음 2800초 중에서 분을 계산한다. 똑같이 2800에서 60을 나누면 46분이 된다.

그리고 남은 40초는 그냥 초로 쓰면 된다.

즉 10000초는 2시간 46분 40초인 것을 알 수 있다. 이걸 코드로 작성하면 아래와 같다.

int hour = amountTime / 3600;
int minute = (amountTime % 3600)/60;  // 나머지에서 60초 나누기
int second = amountTime % 60;

이제 각각의 문자열을 시간 포멧대로 합쳐주면 되는데 이때 한자리수라면 앞에 0 을 포함해서 출력해야한다.

이럴땐 문자열 포멧 코드를 사용하자

  • %s : 문자열
  • %c : 문자 1개
  • %d : 정수
  • %f : 부동소수
  • %o : 8진수
  • %x : 16진수
  • %% : %자체

이렇게 했더니 틀렸음! 왜 그런지 생각해보니까 만약 투하시각과 현재시각이 완벽히 같다면 시간차이는 00:00:00일텐데 문제에 시간은 1초보다 크고 24시간보다 작거나 같다고 했으니 00:00:00은 나올 수가 없다!!

그래서 0보다 작거나 같을때 하루가 넘어가도록 수정했다!!

전체 코드

package learnString;

import java.util.Scanner;

class Main {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String current = sc.next();
        String drop = sc.next();

        // split 사용
        String[] currentUnit = current.split(":");
        int currentHour = Integer.parseInt(currentUnit[0]);
        int currentMinute = Integer.parseInt(currentUnit[1]);
        int currentSecond = Integer.parseInt(currentUnit[2]);
        int currentSecondAmount = currentHour * 3600 + currentMinute * 60 + currentSecond;

        String[] dropUnit = current.split(":");
        int dropHour = Integer.parseInt(currentUnit[0]);
        int dropMinute = Integer.parseInt(currentUnit[1]);
        int dropSecond = Integer.parseInt(currentUnit[2]);
        int dropSecondAmount = currentHour * 3600 + currentMinute * 60 + currentSecond;

        int needSecondAmount = dropSecondAmount - currentSecondAmount;
        // needSecondAmount(필요시간)이 음수라면 하루가 넘어간 것으로 24*3600을 더해준다
        if (needSecondAmount <= 0) {
            needSecondAmount += 24 * 3600;
        }

        int needHour = needSecondAmount / 3600;
        int needMinute = (needSecondAmount % 3600) / 60;
        int needSecond = needSecondAmount % 60;

        System.out.printf("%02d:%02d:%02d", needHour, needMinute, needSecond);
    }
}

반응형