알고리즘

[알고리즘] 백준 13223 자바 문제 풀이

트리스탄1234 2025. 2. 12. 16:07
728x90
반응형

문제

철수는 화학 시험을 망치고, 애꿎은 화학 선생님에게 복수를하기로 한다.

철수는 집에서 만든 자동 로봇팔을 선생님의 책상에 숨겨, 선생님이 수업을 시작하려 들어온 순간 숨겨놓은 로봇팔을 이용해 선생님을 혼내주려고한다. 철수는 선생님이 늘 애용하는 물컵에 시간이 되면 로봇팔이 소금을 잔뜩 집어넣도록 프로그램을 짜려고한다.

철수는 현재시각과 선생님이 언제 컵을 사용할지 시간을 알고있지만, 수 계산에 정말 약해서 로봇팔에 입력해야할 시간 계산을 못한다. 철수가 로봇팔에 알맞은 시간을 입력할수 있도록 도와주자.

입력

첫째 줄에는 현재 시각이 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

 

반응형

이번 포스팅에서는 백준의 소금 폭탄 문제를 풀어 보겠습니다.

문제를 요약하면 폭탄이 터지는 시간이 주어지고, 현재 시간이 주어 지는데 현재 시간에서 얼마의 시간 후에 

 

폭탄이 터지는 시간이 되는지 시간차이를 구하는 문제 입니다. 

 

3가지 부분에 대해서 생각을 해봅시다. 

우선 입력에서 보면 입력 형식이 20:00:00과 같이 사간:분:초가 콜론으로 구분이 되는 형태로 주어 집니다.

 

split 함수를 사용해서 구분자로 콜론을 이용해서 각각 시간, 분, 초를 입력 받고..

시간 차이 계산은 시간차이를 계산하고 분의 차이를 계산하고, 초 차이를 계산 하는것보다.

 

시간도 초로 환산 하고 분도 초로 환산 해서 총시간(초)로 환산하여 계산을 하는게 한번만 계산을 하는거니까

그렇게 필요한 시간을 구한 다음

 

필요한 시간을 다시 시간, 분, 초로 구분을 해서 입력을 하고

출력은 다시 시간:분:초로 콜론으로 구분된 형식으로 표시를 해야 하니 printf를 사용해서 코드를 만들어 보면

 

아래와 같습니다. 여기서 주의할 점을 출력 조건에 보면 " 이 시간은 1초보다 크거나 같고, 24시간보다 작거나 같다"라는 표현이 있습니다. 이 조건을 만족 하기 위해서 if(NeedTimeAmount <=0) <0이 아닌  <= 0인 경우 하루를 추가해 주는 

 

조건을 사용해야 합니다. 아니면 시간이 0으로 표시가 되는 경우가 있거든요. 

728x90
import java.util.*;
import java.io.*;

public class Solution{
	
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));    
        ==> 입력을 받기 위한 버퍼 리더 생성합니다.
	static StringTokenizer st;
	public static void main(String[] args) throws IOException{
		String[] CurrentTime = br.readLine().split(":");                              
          ==> 현재 시간을 String배열에 split함수를 이용해 구분자를 ':'를 
              이용해서 입력을 받습니다.
		int CurHour = Integer.parseInt(CurrentTime[0]);
          ==> String의 첫번째 배열의 값을 CurHour로 저장하고
		int CurMinute = Integer.parseInt(CurrentTime[1]);
          ==> String의 두번째 배열의 값을 CurMinute로 저장하고
		int CurSecond = Integer.parseInt(CurrentTime[2]);    
          ==> String의 두번째 배열의 값을 CurSecond로 저장하고
		
		String[] BomTime = br.readLine().split(":");        
          ==> 소금의 투하 시간을 String 배열에 콜론 구분자를 사용하여 입력을 받습니다.
		int BomHour = Integer.parseInt(BomTime[0]); 
          ==> BomHour에 String배열의 첫번째 값을 저장하고
		int BomMinute = Integer.parseInt(BomTime[1]);        
           ==> BomMinute에 String배열의 두번째 값을 저장하고 
		int BomSecond = Integer.parseInt(BomTime[2]);         
           ==> BomSecond에 String배열의 세번째 값을 저장하고 
		
		int CurrentTimeAmount = CurHour * 3600 + CurMinute * 60 + CurSecond;   
           ==> 필요한 시간을 구하기 위해 현재의 시간을 모두 초 단위로 변경하여 
               합산 합니다.
		int BomTimeAmount = BomHour * 3600 + BomMinute * 60 + BomSecond;     
           ==> 소금 투하 시간을 초단위로 환산 하여 합산 하빈다.
		
		int NeedTimeAmount = BomTimeAmount -  CurrentTimeAmount;                    
           ==> 이제 필요한 시간을 구하기 위해 소금 폭탄 시간에서 현재 시간을 빼줍니다.
		if(NeedTimeAmount <=0) {                                          
        
			NeedTimeAmount += 24 * 3600;   
            ==> 필요한 시간이 0보다 적거나 -인 경우, 즉 다시 말해서 현재 시간의 
                자정을 넘기는 경우 하루의 시간을 초로 환산 하여 더해 줍니다. 
		}
		
		int NeedHour = NeedTimeAmount / 3600;                             
           ==> 구해진 총 시간에서 시간을 구하기 위해 3600초(1시간)을 나누고 몫을 저장하고
		int NeedMinute = (NeedTimeAmount % 3600) /60;                      
           ==> 총 필요 시간에서 시간으로(3600초) 나눈 나머지에 분을 구하기 위해60(초)를 
              나누어 저장하고 
		int NeedSecond = NeedTimeAmount % 60;                             
           ==> 초를 구하기 위해 총 시간에서 60(초)를 나눈 나머지 
               값을 초에 정해 줍니다.
		
		System.out.printf("%02d:%02d:%02d",NeedHour, NeedMinute, NeedSecond);        
           ==> 출력 형식을 맞추기 위해 printf를 이용하여 %02d:%02d:%02d를 이용하여 
		                                                                                                                         시간이나 분또는 초가 한자리 수 일경우 앞에 0을 채워 두자리수와 함께 콜론":"을 출력 합니다.
	}
}

 

728x90
반응형