import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bufferedReader.readLine().trim());
if(N>=2 && N <=20){
for (int i=1; i<=10; i++){
System.out.printf("%d x %d = %d%n", N, i, N*i);
}
}
bufferedReader.close();
}
}
자바 반복문(loop)를 사용해서 푸는 문제다.
그에 앞서 항상 많이 보고 당연한듯 메인 함수를 시작할 때 쓰는 구문을 조금 꼼꼼하게 뜯어 봤다.
public static void main(String[] args)
* public: 당연하게도 메인함수는 어디서나 접근 가능해야 하므로 제한자를 public으로 설정
* static: 역시 메인함수이므로 가비지 콜렉터가 관여할 수 없는 static 영역에 메모리를 할당해 준다. GC에 의해 메인 함수가 정리된다면 프로그램 자체가 죽기 때문! 항상 메모리에 상주하도록 static을 준다.
* void: 역시 메인 함수이므로 리턴 값이 없게 함수를 만든다.
* main: 이건 그냥 메인! 이라는 의미
* String[] args: string을 배열로 사용하겠다는 의미. 자바 프로그램 실행 시 주어진 옵션들이 자동으로 담긴다.
BufferedReader는 Scanner와 유사하지만, 속도가 더 빠르다. 입력된 데이터가 버퍼를 거쳐서 전달되어 처리 효율성이 높고, 따라서 많은 양의 데이터를 처리할 때 유리하다.
사실 단계를 더 거치는데 왜 더 빠른가? 에 대해 의문이 있었는데, 흙을 그냥 퍼서 버리는 것 보다 수레(버퍼)에 담아서 버리는 게 더 효율적이고 많은 양을 버릴 수 있다는 비유를 보고 이해했다.
The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.
공식 문서에는 버퍼 사이즈를 특정할 수 있지만 디폴트값도 충분히 커서 대부분의 경우에 그냥 사용해도 무방하다고 나와있었다.
InputStreamReader에 대해서는 일단 링크를 참고.
문제는 간단하다. 정수 N이 주어지면 1보다 크고 10보다 작은 i 값을 곱해가며 결과를 새 라인에 출력해서 10개의 라인을 만들면 된다.
조건에서 N의 범위는 2보다 크거나 같고 20보다 작거나 같은 정수이므로 아래와 같이 만들어 주었다.
if(N>=2 && N <=20)
다음 정수 N에 곱해줄 i의 범위도 조건지어 준다.
for (int i=1; i<=10; i++) // i 변수를 1로 초기화하고, 10보다 작거나 같을때까지 하나씩 증가시키며 프로그램을 수행한다.
어제 공부한대로 문자열 포맷을 출력해주면 되는데, N x i = result 의 형태로 새로운 라인에 각각 써주어야 하므로 아래와 같이 구성했다.
System.out.printf("%d x %d = %d%n", N, i, N*i); // 곱해지는 값이 Int형으로 출력되도록 %d를 사용하고, %n으로 개행해주면 된다.
제출이 잘 되었다.