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() 은 한 행을 전부 읽기 때문에 공백 단위로 입력해 준 문자열을 공백 단위로 분리해주어야 문제를 풀 수 있을 것이다.
문자열 분리 방법 두 가지로 풀어보자.
- StringTokenizer 클래스를 이용하여 분리해주는 방법
- 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를 사용했을 때의 속도가 확연하게 빠르다.
[백준] 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 |
댓글