본문 바로가기

코딩테스트/백준

백준 : 13223번 소금 폭탄 (JAVA)

목차

    JAVA 풀이 13223번 소금 폭탄

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

    문제

    철수는 화학 시험을 망치고, 애꿎은 화학 선생님에게 복수를하기로 한다.
    
    철수는 집에서 만든 자동 로봇팔을 선생님의 책상에 숨겨,
    선생님이 수업을 시작하려 들어온 순간 숨겨놓은 로봇팔을 이용해 선생님을 혼내주려고한다.
    철수는 선생님이 늘 애용하는 물컵에 시간이 되면 로봇팔이 소금을 잔뜩 집어넣도록 프로그램을 짜려고한다.
    
    철수는 현재시각과 선생님이 언제 컵을 사용할지 시간을 알고있지만, 수 계산에 정말 약해서 로봇팔에 입력해야할 시간 계산을 못한다.
    철수가 로봇팔에 알맞은 시간을 입력할수 있도록 도와주자.

    입력

    첫째 줄에는 현재 시각이 hh:mm:ss로 주어진다.
    시간의 경우 0≤h≤23 이며, 분과 초는 각각 0≤m≤59, 0≤s≤59 이다.
    두 번째 줄에는 소금 투하의 시간이 hh:mm:ss로 주어진다.

    출력

    로봇팔이 소금을 투하할때까지 필요한 시간을 hh:mm:ss로 출력한다.
    이 시간은 1초보다 크거나 같고, 24시간보다 작거나 같다.

    예제 입력 1

    20:00:00
    04:00:00

    예제 출력 1

    08:00:00

    예제 입력 2

    12:34:56
    14:36:22

    예제 출력 2

    02:01:26

    풀이 1

    import java.io.*;
    import java.time.*;
    import java.time.format.*;
    
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		
    		// 시간 형식
    		DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm:ss");
    		
    		// 현재 시각
    		LocalTime nowTime = LocalTime.parse(br.readLine(), format);
    		// 소금 투하 시각
    		LocalTime saltTime = LocalTime.parse(br.readLine(), format);
    		
    		// 소금 투하 시각 - 현재 시각
    		LocalTime resultTime = saltTime.minusHours(nowTime.getHour())
    						.minusMinutes(nowTime.getMinute())
    						.minusSeconds(nowTime.getSecond());
    		
    		// 두 시각이 같다면
    		if(resultTime.equals(LocalTime.MIDNIGHT)) {
    			System.out.println("24:00:00");
    		}else {
    			// 결과 시간 출력
    			System.out.println(resultTime.format(format));
    		}
    	}
    }

    LocalTime 클래스를 이용한 풀이

    각 시각을 저장하여 마이너스 메서드를 이용해 시간 계산


    풀이 2

    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));
    		
    		// 시간 배열
    		int[][] time = new int[2][3];
    		
    		for(int i = 0; i < time.length; i++) {
    			// ":" 을 구분자로 문자열 자르기
    			StringTokenizer st = new StringTokenizer(br.readLine(), ":");
    			
    			for(int j = 0; j < time[0].length; j++) {
    				// 시간 저장
    				time[i][j] = Integer.parseInt(st.nextToken());
    			}
    		}
    		
    		// 결과 시간 배열
    		int[] resultTime = new int[3];
    		
    		for(int i = 0; i < 3; i++) {
    			// 소금 투하 시각 - 현재 시각
    			resultTime[i] = time[1][i] - time[0][i];
    		}
    		
    		for(int i = 2; i >= 0; i--) {
    			// HOURS
    			if(i == 0) {
    				// 음수거나 0과 같다면
    				if(resultTime[i] <= 0) {
    					resultTime[i] += 24;
    				}
    			
    			// MINUTES, SECONDS
    			}else {
    				// 음수라면
    				if(resultTime[i] < 0) {
    					resultTime[i] += 60;
    					resultTime[i - 1]--;
    				}
    			}
    		}
    		
    		// 출력
    		System.out.printf("%02d:%02d:%02d", resultTime[0], resultTime[1], resultTime[2]);
    	}
    }

    특정 클래스를 사용하지 않고 직접 구현한 코드

    for문을 이용하여 중복 코드를 제거함