
✅ 문제
입력한 시간 기준으로 45분 전은 몇시 몇 분인지 출력하는 프로그램 짜기
📥 입력
첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59)
그리고 이것은 현재 상근이가 설정한 알람 시간 H시 M분을 의미한다.
입력 시간은 24시간 표현을 사용한다.
24시간 표현에서 하루의 시작은 0:0(자정)이고,
끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.
📥 출력
첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다.
💡 풀이
Scanner 로 입력받아서 연산하는 법과 BufferedReader 로 입력받아서 연산하는 방법
두 가지로 문제를 해결하였다.
알고리즘 접근법
1. 입력받은 분(min)이 45분보다 작으면 시(hour)에서 1을 빼줘야 한다.
1-1. 0시에서 -1을 하는 경우는 시(hour)가 -1이 되기 때문에 시(hour)를 23으로 고쳐준다.
2. 45분보다 큰 경우에는 시(hour)는 그대로이고 입력받은 분(min)에 45를 빼주면 된다.
위 알고리즘에서 입력값이 45보다 작을 경우 60에서 (45-입력값)을 빼준다.
✅1. Scanner 를 이용한 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int hour = sc.nextInt();
int min = sc.nextInt();
sc.close();
if(min < 45) {
hour--; // 시(hour) 1 감소
min= 60 - (45 - min); // 분(min) 감소
if(hour < 0) {
hour = 23;
}
System.out.println(hour + " " + min);
}
else {
System.out.println(hour + " " + (min - 45));
}
}
}
✅ 2. BufferedReader 를 이용한 풀이
BufferedReader을 쓰면 readLine()으로 입력을 받게 되는데 readLine() 한 줄을 다 읽어오기 때문에 공백을 사이에 두고 입력한 문자열은 공백을 기준으로 분리해주어야 한다.
이 때, 문자열 분리를 위해 String Tokenizer 또는 split()을 사용한다. 주의할 점은 이 메서드들은 입력이 숫자라도 String 타입인 문자열로 결과값을 반환하기 때문에, 만약 결과값을 int 변수에 담아 계산에 이용하기 위해서는 문자열을 int로 형변환(type casting) 해줘야 한다. 캐스팅시 사용하는 메서드는 Integer.parseInt()
1) String Tokenizer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str," ");
int hour = Integer.parseInt(st.nextToken());
int min = Integer.parseInt(st.nextToken());
if(min<45) {
hour--;
min = 60-(45-min);
if(hour<0) hour=23;
} else {
min=min-45;
}
System.out.println(hour+" "+min);
}
}
2) split()
String 타입의 배열을 선언해주고
br.readLine()을 이용하여 받아온 문자열 한 줄을 split()으로 분리해서 배열에 집어 넣는다.
이 때 문자열을 분리하는 기준은 공백(스페이스바 한 칸)이기 때문에 split(" ")이 된다.
그럼 공백 앞 뒤에 있는 문자열이 배열의 각 칸에 순서대로 담기게 되고
Integer.parseInt()를 사용하여 배열에서 꺼내온 문자열을 int로 형변환 해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int hour = Integer.parseInt(str[0]);
int min = Integer.parseInt(str[1]);
if(min<45) {
hour--;
min = 60-(45-min);
if(hour<0) hour=23;
} else {
min=min-45;
}
System.out.println(hour+" "+min);
}
}
'코딩테스트 > BaekJoon' 카테고리의 다른 글
| [백준] 2480번 주사위 세 개 - 자바/java (0) | 2024.04.08 |
|---|---|
| [백준] 2525번 오븐 시계 - 자바 / java (1) | 2024.04.04 |
| [백준] 14681번 사분면 고르기 - 자바 / java (1) | 2024.04.04 |
| [백준] 2753번 윤년 - 자바 / java (0) | 2024.04.04 |
| [백준] 9498번 시험성적 - 자바 / java (1) | 2024.04.04 |