백준 알고리즘 Lv.3 for문 문제들을 java로 풀어보자!
구구단을 출력하는 문제는 워낙 유명하고 기본중에 기본이다. 백준 알고리즘에서 나온 문제 말고도 여러가지 방식으로 다양하게 구구단을 출력해보는 문제들도 많다. 그 유명한 구구클래스도 있지 않는가~
차치하고, 가장 기본 구구단 출력 문제를 풀어보자.
반복문에서는 어느 부분이 반복되는지를 살펴보면 되는데, 위의 문제에서는 1부터 9까지 곱해주는 수가 달라지고 곱셈 문장은 계속 똑같은 형식으로 출력되고 있는 것을 볼 수 있다.
이번에 문제풀면서 큰 문제는 없었지만 어째서인지 또 컴파일 에러가 난것...
javascript를 쓰다가 java를 쓰려니까 출력문에 '작은따옴표'
가 아니라 "큰따옴표"
를 써야한다는 것을..까먹었던 것! 저번 level2 if문 예제 풀때도 똑같은데서 컴파일 에러났는데 이번에도 또 그래서 다시 한번 적어둔다.
java의 경우 BufferedReader와 BufferedWriter를 사용하여 빠른 더하기를 구한다. 보통은 입출력을 Scanner, System.out.println으로 하는데 buffer를 사용하는 것보다 속도가 느린편이라 빠른 속도의 연산 처리를 위해서는 buffer를 활용해 계산한다. 데이터가 많아질수록 버퍼를 이용해 데이터를 처리하면 더 빠르게 처리가 가능해진다. BufferedReader와 BufferedWriter 사용법을 알아보자~!
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine(); //줄단위로 입력값을 받음
int num = Integer.parseInt(line); //문자열로 들어온 입력값을 정수로 형변환
따라서 입력받은 값을 한줄 단위로 인식하기 때문에, 공백단위로 입력받는 scanner와는 다르게, 입력받은 데이터를 따로 가공해줘야 한다.
그리고 강제로 타입 변환을 해서 int값으로 바꿔주어 사용 가능하다.
코드를 쓰고 제출했더니 컴파일 에러가 났다. error: cannot find symbol 에러메세지가 나타내는 건 컴파일러가 식별자를 알아볼 수 없기 때문으로 대체로 선언한 적 없는 변수를 사용하거나 범위 바깥에 있는 변수를 사용할때 이런 에러가 난다.
이번에는 BufferedReader 자체를 인식하지 못하고 있는 것 같아서보니 입출력과 관련한 패키지를 가져오지 못했기 때문에 import java.io.*
입출력 패키지를 import 해온다.
BufferedReader와 Writer를 쓸 때는 try-catch로 에러처리를 반드시 해줘야 한다.
그렇지 않으면, 또 컴파일 에러가 난다. 에러처리도 까먹지 않고 꼭..!
컴파일 에러를 다 수정하고 드디어 통과.
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args){
try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//제일 처음 입력값으로 들어오는 테스트 케이스 수
int total = Integer.parseInt(br.readLine());
//1부터 입력받은 값까지 반복문으로 더하기
for(int i=1;i <= total;i++){
//buffer는 문자로 값을 읽음(줄 단위)
String s = br.readLine();
//받은 문자열 공백 단위로 끊기
String arr [] = s.split(" ");
//배열안에 저장된 값들을 모두 int로 변형시키고,
int firstNum = Integer.parseInt(arr[0]);
int secondNum = Integer.parseInt(arr[1]);
//첫번째 수와 두번째 수를 모두 더한 값을 바로 bufferwrite으로 출력해준다
bw.write(firstNum+secondNum+"\n");
}
//버퍼에 남아있는 값을 다 내보낸다
bw.flush();
//버퍼를 닫아준다
bw.close();
}
//반드시 예외처리를 해줘야 한다. 안그러면 컴파일 에러가 난다.
catch(IOException e){
}
}
}
입력받은 테스트 케이스를 더하여 그 결과값을 출력해주는 문제이다. 대신 출력할 때,
이렇게 Case #순서가 붙어야 한다.
그리고 문제푸는 방식과 상관없이 🙀😿 자꾸 틀리는 System.out.println 출력 🙀😿
처음에 썼던 코드는 더한 값을 출력하는게 아니라 프린트문에서 더해줬다.
//결과값을 바로 더해주면 되겠지?
System.out.println("Case #"+i+": "+ firstNum + secondNum);
//출력 예시
11
23
34
98
52
하지만 출력문에서 바로 더해줄경우 이미 문자열과 섞여서 출력이 되고 있었기 때문에 정수의 합이 아닌 정수를 문자열처럼 나란히 나열해줄 뿐이었다...
결국 정수 변수를 만들어 따로 더해주고 출력!
import java.util.*;
public class Q11021{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
//테스트 케이스의 개수 T값
int total = scan.nextInt();
for(int i=1; i <= total; i++){
int firstNum = scan.nextInt();
int secondNum = scan.nextInt();
//int sum = firstNum + secondNum;
System.out.println("Case #"+i+": "+ firstNum + secondNum);
}
}
}
이런 쉬운 것에서도 자꾸 틀리지 않도록 까먹지 말고 잘 쓰자!
별 찍기 문제로 별을 어디에 찍어주느냐에 따라 문제 유형이 다르다.
문제를 풀때 사용한 방법은 이중 for문이다.
입력 예제와 출력 예제를 보면, 정렬이 어느쪽으로 되어있는지의 차이만 있고 입력받은 N번째 줄까지 별을 찍어 출력하라는 문제다.
2438번은
2439번은
public class Q2438 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
//입력받은 줄(N)만큼 반복
for(int i=1;i<=num;i++){
//매 줄마다 찍을 별의 개수만큼 반복
for(int j=0;j<i;j++){
//i=1이면, j=0부터 1미만으로 반복(*),
//i=2이면, j=0부터 2미만으로 반복(**)
//...
System.out.print("*");
}
//다음줄로 넘어가는 줄 변경
System.out.println("");
}
}
}
2438번은 기본적으로 출력이 왼쪽에서부터 찍혀나오는 System.out.print
이기 때문에 별의 개수만 맞춰서 for문을 작성해주면 된다.
2439번의 경우에는 출력을 했을때 생기는 공백까지도 직접 출력을 해줘야 한다.
public class Q2439 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
//입력받은 줄 수 만큼 반복하는 첫번째 for문
for(int i=1;i<=num;i++){
//공백찍기
//두번째 for문은 공백의 개수를 찍어내는 역할
//공백은 줄이 넘어갈수록 개수가 줄어들어야 한다
for(int j=num;j>i;j--){
System.out.print(" ");
}
//별찍기
//공백이 찍힌 후 해당 줄에 찍힐 별
//별은 줄수에 맞춰 그 개수만큼 찍혀야 한다
for(int k=0;k<i;k++){
System.out.print("*");
}
//다음줄로 넘어감
System.out.println();
}
}
위를 활용한다면 다양한 별찍기를 시도해볼 수 있다!
거꾸로 줄어드는 별찍기도 출력이 가능해진다.
import java.util.*;
public class StarPrint {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
//입력받은 줄 수 만큼 반복하는 첫번째 for문
for(int i=0;i<num;i++){
//두번째 for문은 공백의 개수를 찍어내는 역할
//공백은 줄이 넘어갈수록 개수가 줄어들어야 한다
for(int j=num;j>i;j--){
System.out.print("*");
}
System.out.println();
}
}
}