문제 해석
소금팔에 시간을 입력해야함.
첫째줄에는 현재시각이 나오고 둘째줄에는 소금 투하시간이 나옴
즉 두 시간의 차이를 구하는 문제임
예시
20시와 04시의 시간 차이는 8시간
12:34:56 과 14:36:22 시간차이는 2시간 1분 26초 차이
접근법
- 시간을 입력받는다
- : 문자를 기준으로 시간, 분, 초를 쪼갠다.
- 입력받은 두개의 시간을 비교한다.
- 두개의 시간, 분, 초의 차이를 비교한다
- 구해진 시간을 HH:MM:SS 형태로 출력한다
1. 시간을 입력받는다
일단 시간을 쪼개는거부터 난관인데 몇가지 방법이 있을 것 같다. 일단 “:” 가 포함되어 있기 때문에 무조건 문자로 받아야한다. 그 다음 세가지 방법이 있다.
- 그냥 냅다 반복문을 돈다.
- subString() 함수를 사용하여 원하는곳의 문자열을 떼어낸 후 다시 숫자로 치환한다.
- split() 함수를 사용한다.
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);
}
}
'coding test' 카테고리의 다른 글
배열_백준_10431_줄 세우기 (2) | 2024.03.07 |
---|---|
배열_백준_1236_성지키기 (1) | 2024.03.07 |
문자열 - 백준 1543번 문서검색 (0) | 2024.03.06 |
문자열 - 백준 1157번 단어 공부 (0) | 2024.03.05 |
문자열 - 백준 1919번 애너그램 만들기 (0) | 2024.03.04 |