단계별 문제풀이로 익히는 java
이번엔 if 조건문과 관련한 문제들
두가지 수를 입력받아 원하는 결과값을 if문에 따라 다르게 출력해준다. 대소비교에 따라 결과값이 달라지도록 한다.
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
if(a < b){
System.out.println("<");
}else if(a > b){
System.out.println(">");
}else System.out.println("==");
}
}
윤년은 4와 400으로 나눠지면서 100으로는 나눠지지 않는 4자리수의 연도이다. 이를 if 조건문으로 작성해 입력으로 들어오는 4자리 정수의 윤년 여부를 판별해줘야한다.
위의 이미지처럼 조건문을 and와 or 연산자로 전부 하나의 if문 안에 넣어줬더니, 컴파일 에러가 났다. 왜 컴파일 에러가 났나 다시 자세히 살펴보니, leap % 400 = 0
이라고 작성하여 에러가 났다. 이럴 경우 등호비교를 하는 것이 아니라 값을 넣어준다는 뜻인데 그 값이 400이라는 정수로 되어있기 때문에 당연히 성립이 될리가 없다. 따라서 leap % 400 == 0
으로 바꿔주면 문제없이 통과한다.
또 다른 방법으로 else if를 사용할 경우에는 다음과 같이 작성한다.
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int leap = sc.nextInt();
if(leap % 4 == 0 && leap % 100 != 0){
System.out.println(1);
}else if(leap % 400 == 0){
System.out.println(1);
}else {
System.out.println(0);
}
}
}
이럴 경우에도 문제없이 통과된다.
문제가 길지만 요약하자면 Hour와 Minute을 입력받아 45분 전 값을 출력하는 문제이다.
이 문제를 풀때는 어떤 규칙이 있는지를 생각해보고 edge case를 생각해 if문으로 따로 조건을 걸어주었다.
1)첫번째로는 minute과 관련해 어떻게 변하는지를 따진다.
45분 이상으로 숫자가 클경우에는 45분전으로 시간을 돌리는게 어렵지 않다. 입력받은 Minute의 값에서 45분을 빼주면 되기 때문이다.
하지만 45분보다 작을경우에는 Minute값만 바꿔주어서는 안되고, Hour도 1씩 줄어야 한다. 혹여 2를 빼주는 경우도 생각을 해봤으나 최솟값인 0분에서 45분 전으로 돌린다하면 (hour-1)시 (15)분이기 때문에 -1만 해주면 된다.
0시의 경우 -1을 했을 때 -1이 아닌 23시로 변하는 것까지 조건문안에서 반영해줘야 한다.
이러한 조건을 모두 생각하고 if문을 작성한다면 다음과 같다.
/* 백준알고리즘 2884번 문제
시간과 분을 45분 전으로 설정하여 출력하기
*/
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int hour = scan.nextInt();
int minute = scan.nextInt();
//minute이 45분보다 작은경우, hour에 변화가 생김
if(minute < 45){
//시간이 1~23일때
if(hour != 0){
//시간이 -1 줄어든다
hour--;
//60분 중에서 (45 - minute)분한 시간을 빼준다
minute = 60 - (45 - minute);
//옳은 출력방식
System.out.println(hour+" "+minute);
}
//시간이 0일때
else if(hour == 0){
//23시로 바꿔줘야한다
hour = 23;
minute = 60 - (45 - minute);
System.out.println(hour+" "+minute);
}
}else{//minute이 45분보다 클때, hour는 그대로
minute = minute - 45;
System.out.println(hour+" "+minute);
}
}
}
+) 참고로 처음 시도했을 때는 컴파일 에러가 났었다. 이유는 출력하는 문장을 잘못썼기 때문에. 오랜만에 java로 연습하니 자꾸 기본적인 문장에서 틀린다.
처음 내가 작성한 출력문은 System.out.println("%d %d", hour, minute);
문자열로써 출력하는 문장이었다. 하지만 문제에서 원하는 출력값은 정수 그대로 출력하는 것이었기 때문에 컴파일 에러가 난거 같다.
따라서 여러 시행착오를 거쳐 (System.out.println(hour, minute);
를 해보기도...) 출력해야하는 값에 맞는 형식으로 System.out.println(hour+" "+minute);
출력해준다.
++) 제대로 풀었다고 생각했는데 자꾸 정답이 틀렸다고 나왔음. 왜그런가 싶어서 계속 보는데...
처음 썼던 코드 👎
if(minute < 45){
//시간이 1~23일때
if(hour != 0){
//시간이 -1 줄어든다
hour = hour - 1;
//60분 중에서 (45 - minute)분한 시간을 빼준다
minute = 60 - (45 - minute);
//옳은 출력방식
System.out.println(hour+" "+minute);
}
//시간이 0일때
if(hour == 0){
//23시로 바꿔줘야한다
hour = 23;
minute = 60 - (45 - minute);
System.out.println(hour+" "+minute);
}
hour를 나누는 조건문 if에서 if-else if문이 아니라 if-if문으로 작성을 하여 문제가 생기는 것이었다.
예를들면, hour가 1이고 minute이 30일 때, 첫번째 조건문 if(minute < 45)
를 만족하여 조건문 안으로 들어온다.
hour가 1이니까 그 다음 조건문 if(hour !=0)
를 통과하여 hour = hour - 1;
문장을 수행한다.
그러면 hour는 0으로 값이 변하는데 여기서!!!문제가 발생한다.
hour는 0으로 값이 변한 상태인데 if(hour != 0)
문을 빠져나오면 그 다음 if(hour == 0)
문을 만나게 된다.
그러면 의도와 다르게 if 조건문 안으로 들어가버린다.
이렇게 변수를 내가 수정하는 경우에는 해당하는 if 조건문에 잘 들어와있는지, 다른 조건문으로 들어가지는 않는지 따져봐야한다.
따라서 위의 문제를 해결하려면 else if문으로 작성해줘야한다.