[백준] 2739번 : 구구단 - JAVA [자바]
https://www.acmicpc.net/problem/2739
-
문제
매우 간단한 문제다!
다만 주의할 점이라면 출력에서 보듯이 각 문자 사이에 공백이 있으니 반드시 유의하여 공백을 꼭 추가해주어야한다.
- 2가지 풀이 방법
기본적으로 많이 사용되는 Scanner 로 입력받아 연산하는 방법과 BufferedReader 로 입력받아 연산하는 방법, 두 가지 방법을 통해 풀이해보고자 한다.
추가로 성능(시간)을 개선한 필자가 제출했던 코드 또한 보여주고자 한다.
위 방법은 앞서 포스팅에서도 언급했으니 만약 쓰는 방법을 모른다면 아래 링크를 통해 읽어보는 것을 추천한다.
※Scanner 와 BufferedReader 의 입력방법에 대해 알아보고자 한다면 아래 링크의 포스팅을 보면 된다.
- 풀이
- 방법 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
in.close();
for(int i = 1; i<10;i++) {
System.out.println(a+" * "+i+" = "+(a*i));
}
}
}
가장 기초적인 방법이다.
각 문자열 사이에 공백 반드시 넣어줄 것!
- 방법 2
BufferedReader 을 쓰는 방식이다.
위 방법은 Scanner 로 입력받는 방법보다 훨씬 성능이 우월하다. 글 마지막에 성능을 비교한 사진이 있으니 참고해보면 된다.
그리고 반드시 자료형 타입을 잘 보아야 한다.
BufferedReader 의 기본 타입은 문자열이니 Integer.parseInt()로 int 형으로 변환시켜준다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
br.close();
for(int i = 1; i<10;i++) {
System.out.println(a+" * "+i+" = "+(a*i));
}
}
}
- 성능 개선 코드
필자의 경우 보통 출력할 문자가 많을 때는 StringBuilder 또는 BufferedWriter 을 사용한다.
(이 정도의 출력물은 딱히 쓸 필요는 없지만 나중에는 중요해진다)
객체에 문자열을 하나로 이어줘서 데이터를 보내느냐, 버퍼에 담아두었다가 한번에 데이터를 보내느냐의 차이인데 쓰이는 주 목적은 다르지만 백준 알고리즘에서는 크게 다른 목적을 두고있진 않으므로 둘 중 어느 것을 택해도 상관이 없다.
이왕 두 가지 출력방법을 얘기한김에 두 코드 모두 보여주겠다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
br.close();
StringBuilder sb = new StringBuilder();
for(int i = 1; i<10;i++) {
sb.append(a).append(' ').append('*').append(' ').append(i);
sb.append(' ').append('=').append(' ').append(a*i).append('\n');
}
System.out.print(sb);
}
}
- StringBuilder 을 쓴 코드인데 필자가 테스트해본 결과 sb.append(a+" * "+i+" = "+a*i+"\n"); 으로 한번에 넣어주는 것보다 위와 같이 문자를 하나씩 append 해주는 것이 속도가 조금 더 빠른 것으로 나온다. 이유는 잘 모르겠으나..
만약 알게된다면 수정하여 알려주도록 하겠다. 아마 이 문제에서는 큰 차이는 없을 것이다.
(아마 각 타입을 검사하고 변환하기 때문이 아닐까 생각이 든다)
또 다른 방법은 BufferedWriter 을 쓰는 방법이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
br.close();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i = 1; i<10;i++) {
bw.write(a+" * "+i+" = "+a*i+"\n");
}
bw.flush();
bw.close();
}
}
참고로 BufferedWriter 는 int형 변수만 따로 써도 int값으로 나오지 않는다.
이럴 때 해결 방법은 두 가지가 있는데, 하나는 문자열이랑 혼합하여 사용하는 방법과 int값을 String으로 변환시켜주어야 한다.
- 성능 차이
위에서 부터 순서대로
채점 번호 : 17689497 - BufferedReader + BufferedWriter 사용
채점 번호 : 17689486 - BufferedReader + StringBuilder 사용
채점 번호 : 17689477 - BufferedReader + System.out.println 사용
채점 번호 : 17689463 - Scanner + System.out.println 사용
시간을 보면 BufferedReader 와 Scanner 의 성능차이가 확연하게 나는 것을 볼 수가 있다.
시간 단축에 의미를 두는 분들은 참고하시길 바란다.
- 정리
가장 기본적인 문제였다. 길게 설명할 게 따로 없었던 만큼 성능을 높이는 방향으로 코딩을 해보았다.
반복문은 기본적으로 성능개선을 하는 방법이 있다.
혹시나 궁금하다면 아래 링크의 포스팅을 보면 된다.
https://st-lab.tistory.com/27?category=830901
질문은 언제나 환영하니 언제든 모르는게 있으면 물어보셔도 된다.
'JAVA - 백준 [BAEK JOON] > 반복문' 카테고리의 다른 글
[백준] 11022번 : A+B - 8 - JAVA [자바] (10) | 2020.02.19 |
---|---|
[백준] 11021번 : A+B - 7 - JAVA [자바] (13) | 2020.02.19 |
[백준] 15552번 : 빠른 A+B - JAVA [자바] (34) | 2020.02.17 |
[백준] 8393번 : 합 - JAVA [자바] (5) | 2020.02.15 |
[백준] 10950번 : A+B - 3 - JAVA [자바] (14) | 2020.02.15 |