상냥한 세상 :: [백준]1330번: 두 수 비교하기

본문으로 바로가기

[백준]1330번: 두 수 비교하기

category Computer Science/BAEKJOON JAVA Practice 2021. 12. 26. 09:44
  • 문제

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

 

1330번: 두 수 비교하기

두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.

www.acmicpc.net

간단한 연산작업과 문자열 출력을 어떻게 하는지 알았으니, 이제부턴 if문을 몇가지 연습해보고자한다. 

이 문제에서 요구하는건 입력으로 두 숫자를 받은뒤, 각각의 크기를 비교하고 특정조건에 해당하면 크기비교 연산자(<,>,==)를 출력하게 짜야한다. 단, 크기비교를 위한 두 숫자 A,B는 -10,000~10,000범위 사이의 숫자여야한다. 우선 if문의 기초부터 다루는 문제니까 가볍게 따라오면 될 것 같다. 


  • 코드1
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
    	Scanner in=new Scanner(System.in);
        
        int A=in.nextInt();
        int B=in.nextInt();
        
        in.close();
        
        //A와 B의 범위를 한정해주기위해 삼항연산자를 사용
        
        String str = (A>B)?">":((A<B)?"<":"==");
        System.out.println(str);
        //System.out.println((A>B) ? ">" : ((A<B) ? "<" : "==" )); 이게 더 가독성 좋음
    }
}

기본적인 연산자 ==, +,- 같은건 알고있는데 어디선가 모를 : 와 ? 가 튀어나왔다. 나역시도 ? 를 보는순간 진짜로 ? 했다.

Ternary Operator(삼항 연산자): 세개의 연산자를 필요로 하는 연산자
※삼항연산자 사용시 코드를 좀 더 간결하게 작성할수 있지만, 짧다고 해서 if문에 비해서 속도가 빠르진 않다. 축약형식이라 잘못사용하면 소스코드의 가독성을 저해시키기도 한다. 그리고 한줄안에 모든 조건식과 결과값들이 들어가 있어서 줄단위 디버깅이 상당히 힘들다. 

※정말 가독성을 안해치고 코드만 간결해지는 범위내에서 삼항연산자를 쓰는게 좋고 이외에는 if를 쓰는게 좋을것 같다.

  • 삼항연산자의 기본 문법
    ※True/False를 판단할 수 있는 조건식을 작성한 뒤 연산결과인 true/false에 실행되는 표현식을 작성하면 된다.
    아래 그림을 보면, true일 경우 값또는 연산식을 진행하는 피연산자2로 가면되고, false일 경우 피연산자3으로 가면된다.

  • 삼항연산자의 예시
    // if 문 사용
    int A = 0; 
    if(1 > 3) { 
    	A = 10; 
    }
        
    else{ 
    	A = 30; 
    } 
    // 결과 A = 30; 
    
    
    // 삼항 연산자 사용
    int A = (1 > 3) ? 10 : 30; 
    // 결과 A = 30;​

다시 돌아와서 코드1의 아래 삼항연산자 식을 봐 보자. 문제에서 요구한대로 진행하려면
피연산자1(조건식): A>B
피연산자2(값or연산식):">"
피연산자3(값or연산식):A<B?"<":"=="
▶피연산자3-1(피연산자3의 피연산자1(조건식)):A<B
▶피연산자3-2(피연산자3의 피연산자2(값or연산식)):"<"
▶피연산자3-3(피연산자3의 피연산자3(값or연산식)):"=="

String str = (A>B)?">":((A<B)?"<":"==");

 

물론 if문으로 적으면 아래와 같다.

if(A>B) System.out.println(">");
else if(A<B) System.out.println("<");
else System.out.println("==");

  • 결과

Scanner 삼항연산자 사용
Scanner if문 사용


  • 코드2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args){
      BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

      StringTokenizer st=new StringTokenizer(br.readLine(), " ");
      int A=Integer.parseInt(st.nextToken());
      int B=Integer.parseInt(st.nextToken());

      System.out.println((A>B) ? ">": ((A<B) ? "<":"=="));
    }
}

삼항연산자의 사용은 같고, 역시 속도향상을 위해 BufferedReader+StringTokenizer의 조합을 사용했다.


  • 결과


  • 코드3

이번에는 위에를 살짝 변형시켜 readLine()을 통해 읽어온 것을 split(" ")하여 공백단위로 나누고 String배열에 저장하는 것이다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.IOException;

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 A=Integer.parseInt(str[0]);
      int B=Integer.parseInt(str[1]);

      System.out.println((A>B) ? ">": (A<B)? "<":"==");
    }
}

이전에 깜빡하고 말 안한게 있는데,Buffer와 함께 StringTokenizer을 대체해서 split을 사용하면 문자열배열에 담아줘야한다. 왜냐면 split자체는 문자열을 잘라주는거라 그렇다.


  • 결과


  • 코드1,2,3 속도비교

Scanner 삼항연산자 사용
Scanner if문사용
BufferedReader+StringTokenizer 삼항연산자 사용
BufferedReader+Split 삼항연산자 사용