본문 바로가기
ONLINE JUDGE/제어문

[백준1330] 두 수 비교하기

by W_W_Woody 2022. 1. 13.

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

 

1330번: 두 수 비교하기

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

www.acmicpc.net


방법1. Scanner로 입력 받는 법

먼저 Scanner클래스를 사용하려면, 아래의 한 문장을 추가해줘야 한다.

import java.util.Scanner; 

그 다음엔 Scanner클래스의 객체를 생성한다.

Scanner sc = new Scanner(System.in);

 

그리고 nextLine()이라는 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 ‘엔터키(Enter)’를 누르면 입력한 내용이 문자열로 반환된다.

 

정수형으로 입력 받을 때 sc.nextInt(); 

 

boolean - nextBoolean()
byte - nextByte()
short - nextShort()
int - nextlnt()
long - nextLong()
double - nextDouble()
float - nextFloat()
String - nextLine()

 

sc.close();  입력이 끝났음을 의미한다. 닫아주는 거 잊지 말고!

close()를 해줌으로서 메모리가 조금 줄어있다.

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();
		sc.close();
		
		if(A>B) {
			System.out.println('>');
		}else if(A<B) {
			System.out.println('<');
			
		}else if(A==B) {
			System.out.println("==");
			
		}
	}
}

방법2. BufferedReader로 입력 받는 법

BufferedReader/BufferedWriter는 버퍼를 이용해서 입줄력의 효율을 높일 수 있도록 해주는 역할을 한다.
버퍼를 이용하면 입출력의 효율이 비교할 수 없을 정도로 좋아지기 때문에 사용하는 것이 좋다.
BufferedReader의 readLine()을 사용하면 데이터를 라인단위로 읽을 수 있고,
BufferedWriter는 newLine()이라는 줄바꿈 해주는 메서드를 가지고 있다.

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

BufferedReader br = null;

 

try{ 

BufferedReader br new BufferedReader(new InputStreamReader(System.in) );

system.in : 콘솔로부터 데이터를 입력받고 1바이트 입력하는(바이트스트림이 기본)

InputStreamReader : 이름에서 알 수 있는 것과 같이 바이트기반 스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다.

그리고 바이트기반 스트림 의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다.

(바이트스트림을 인트스트림으로 변환시킨다.)

 

입력받을 때는 br.readLine();

BufferedReader가 가지고 있는 readLine()메서드는 IOException이 발생할 수 있으니까 예외처리(try-catch)를 해줘야한다.

(String java.io.BufferedReader.readLine() throws IOException)

String으로 반환하기에 숫자로 입력 받을 경우  Integer.parseInt(br.readLine());

파싱시켜준다. (String→int 변환)

 

readLine의 예외 처리 안해줬을 경우

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

public class Day03_stringToken2 { // 1130
	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		int A = Integer.parseInt(br.readLine());
		int B = Integer.parseInt(br.readLine());

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

예외처리 안했을 때


그러나

readLine() 한 행을 전부 읽기 때문에 공백 단위로 입력해 준 문자열을 공백 단위로 분리해주어야 문제를 풀 수 있을 것이다.

문자열 분리 방법 두 가지로 풀어보자.

  1. StringTokenizer 클래스를 이용하여 분리해주는 방법
  2. split() 을 이용하는 방법

1) java.util.StringTokenizer클래스

문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는 데 사용된다.

 

*이외에도 아래와 같이 String 의 split (String regex) 이나 Scanner의 useDelimiter(String pattern)를 사용할 수도 있지만,

String[] result = "100,200,300,400".split,;
Scanner sc2 = new Scanner("100,200,300,400").useDelimiter;

이 두 가지 방법은 정규식 표현(Regular expression)을 사용해야하므로 정규식 표현에 익숙하지 않은 경우 StringTokenizer를 사용하는 것이 간단하면서도 명확한 결과를 얻을 수 있을 것이다.
그러나 StringTokenizer는 구분자로 단 하나의 문자 밖에 사용하지 못하기 때문에 보다 복잡한 형태의 구분자로 문자열을 나누어야 할 때는 어쩔 수 없이 정규식을 사용하는 메서드를 사용해야 할 것이다.

 

◎ StringTokenizer에서 주로 사용되는 생성자와 메서드는 다음과 같다.

StringTokenizer의 생성자/메서드 설명
StringTokenizer(String str, String delim)
StringTokenizer(문자열, 지정할구분자)
문자열 (str)을 지정된 구분자(delim)로 나누는 StringTokenizer 를 생성한다.(구분자는 토큰으로 간주되지 않음)
StringTokenizer
(String str, String delim, boolean returnDelims)
문자열(str)을 지정된 구분자(d이im)로 나누는 StringTokenizer 를 생성한다. returnDelims의 값을 true로 하면 구분자도 토큰으 로 간주된다.
int countTokens( ) 전체 토큰의 수를 반환한다.
boolean hasMoreTokens( ) 토큰이 남아있는지 알려준다.
String nextToken( ) 다음 토큰을 반환한다.(문자열 반환)

 

예제1>

import java.util.StringTokenizer;

public class Day03_stringToken {
	public static void main(String[] args) {
		String source = "100,200,300,400";
		StringTokenizer st = new StringTokenizer(source, ",");
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
	} // main의 끝
}

예제1-2>

import java.util.StringTokenizer;

public class Day03_stringToken {
	public static void main(String[] args) {
		String source = "100 200 300 400";
		StringTokenizer st = new StringTokenizer(source, " ");
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
	} // main의 끝
}

st.nextToken() 은 문자열을 반환하니 Integer.parseInt()로 int 형으로 변환시켜준다.

Integer.parseInt(st.nextToken());

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

public class Day03_stringToken2 { // 1130
	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 A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());

		System.out.println(A > B ? '>' : (A < B ? '<' : "=="));
	}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Day03_stringToken2 { // 1130
	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = null;
		try {
			str = br.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		StringTokenizer st = new StringTokenizer(str," ");
		
		int A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());

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

2) split()

br.readLine() 을 통해 읽어온 것을 split(" ") 하여 공백 단위로 나눠준 뒤 String 배열에 각각 저장한다.

String[] str = br.readLine().split(" ");

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

public class Day03_split { // 1130
	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 ? '<' : "=="));
	}
}

split()은 빈 문자열도 토큰으로 인식하는 반면,

StringTokenizer는 빈 문자열을 토큰으로 인식하지 않기 때문에 인식하는 토큰의 개수가 서로 다른 것을 알 수 있다.


이 외에도 성능의 차이가 있는데,

split()은 데이터를 토큰으로 잘라낸 결과를 배열에 담아서 반환하기 때문에

데이터를 토큰으로 바로바로 잘라서 반환하는 StringTokenizer보다 성능이 떨어질 수밖에 없다.


방법3. 중첩.삼항연산자를 이용하는 법

삼항연산자를 사용 시 속도가 빨라지는 건 아니지만 가독성이 좋아진다.

변수 = (조건문 (true일 때의 연산)  :  (false일 때의 연산) ;

 

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();
		sc.close();
			
		String str = (A>B) ? ">" : ((A<B) ? "<" : "==" );
		System.out.println(str);
	}
}

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

 

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();
		sc.close();
			
		System.out.println((A>B) ? ">" : ((A<B) ? "<" : "==" ));
	}
}

String str 변수 생성 없이 바로 print메서드에 넣어서 출력도 가능하다.

 

Scanner와  BufferedReader의 성능 차이는 BufferdReader를 사용했을 때의 속도가 확연하게 빠르다.

https://st-lab.tistory.com/21

 

[백준] 1330번 : 두 수 비교하기 - JAVA [자바]

https://www.acmicpc.net/problem/1330 1330번: 두 수 비교하기 두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오. www.acmicpc.net 문제 if 조건문의 기초 중의 기초다! ※ 주의할점 입력..

st-lab.tistory.com

 

'ONLINE JUDGE > 제어문' 카테고리의 다른 글

[백준2741/2742] N찍기/기찍N  (0) 2022.01.27
[백준8393] 합  (0) 2022.01.27
[백준10950] A+B - 3  (0) 2022.01.26
[백준2739] 구구단  (0) 2022.01.26
[백준2884] 알람 시계  (0) 2022.01.21

댓글