1️⃣ 2739 번: 구구단
https://www.acmicpc.net/problem/2739
💻 나의 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 1; i <= 9; i++) {
System.out.println(n + " * " + i + " = " + n * i);
}
}
}
가장 기본적인 반복문 문제입니다.
숫자 n을 입력 받는데 n은 1보다 크거나 같고 9보다 작거나 같습니다.
2️⃣ 10950번: A+B-3
https://www.acmicpc.net/problem/10950
💻 나의 풀이
import.java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i = 0; i < t; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a+b);
}
}
}
3️⃣ 8393번: 합
https://www.acmicpc.net/problem/8393
💻 나의 풀이
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum = 0;
for(int i = 0; i <= n; i++) {
sum += i;
}
System.out.println(sum);
}
}
4️⃣ 25304번: 영수증
https://www.acmicpc.net/problem/25304
💻 나의 풀이
이차원 배열을 써서 해결하는 코드와 쓰지않는 코드 두 가지가 있는데
먼저 이차원 배열을 쓰지않는 코드입니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt(); // 총 금액
int n = sc.nextInt(); // 구매한 물건 종류 개수
int totalPrice = 0; // 총 금액이 맞는지 비교
for(int i = 0; i < n; i++) {
int price = sc.nextInt(); // 상품가격
int count = sc.nextInt(); // 상품개수
totalPrice += price * count;
}
if(x == totalPrice) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
이차원 배열 대신 각 물건의 가격과 개수를 따로 변수로 저장하고, 반복문을 통해 총 가격을 계산합니다.
코드 자체는 더 직관적이고 간결해지지만, 물건의 종류가 많아질수록 변수의 개수가 증가하므로 관리가 어려워질 수 있습니다.
그리하여, 이차원 배열을 사용하는 코드를 다시 작성해봤습니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt(); // 총 금액
int n = sc.nextInt(); // 구매한 물건 종류 개수
int product[][] = new int[n][2]; // [0]: 상품가격 [1]: 상품개수
// 총 금액이 맞는지 비교
int comp = 0;
for(int i = 0; i < product.length; i++) {
product[i][0] = sc.nextInt(); // 상품가격
product[i][1] = sc.nextInt(); // 상품개수
comp += product[i][0] * product[i][1]; // 총 금액 계산 = 각 물건의 가격과 개수를 곱한 값을 더한다.
}
// 입력받은 총 금액과 계산된 총 금액이 같은지 비교
if(x == comp) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
이차원 배열을 사용하는 이유는 각 물건의 가격과 개수를 한 쌍으로 관리하기 위해서입니다.
5️⃣ 25314번: 코딩은 체육과목 입니다
https://www.acmicpc.net/problem/25314
💻 나의 풀이
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int div = n / 4;
for(int i = 0; i < div; i++) {
System.out.print("long ");
}
System.out.println("int");
}
}
4의 배수를 입력하고 그 배수만큼 long을 출력해줍니다.
4로 나눈 몫만큼 for문을 돌려서 long을 출력합니다.
6️⃣ 15552번: 빠른 A+B
https://www.acmicpc.net/problem/15552
💻 나의 풀이
Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
문제에 위와 같은 말이 있기 때문에 이번에는 BufferedReader를 사용해봅시다.
💡 BufferedReader
Java에서 효율적인 텍스트 입력을 위한 클래스입니다. 이 클래스는 입력 스트림에서 문자를 읽어오는데, 내부적으로 데이터를 버퍼에 저장하여 한 번에 여러 문자를 읽어올 수 있습니다. 이로 인해 입출력 작업이 더 효율적으로 이루어집니다.
BufferedReader를 사용하면 프로그램이 입력 스트림으로부터 데이터를 한 문자씩이 아닌 더 큰 블록 단위로 읽어들일 수 있으므로 입출력 속도가 향상됩니다. 특히 대용량 데이터를 처리할 때 유용합니다.
아래는 BufferedReader를 사용하여 표준 입력에서 한 줄을 읽어오는 예제 코드입니다.
BufferedReader는 System.in을 통해 표준 입력으로부터 데이터를 읽어옵니다.import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { String line = br.readLine(); // 한 줄을 읽어옴 System.out.println("입력된 값: " + line); br.close(); // BufferedReader를 닫음 } catch (IOException e) { e.printStackTrace(); } } }
readLine() 메서드를 사용하여 한 줄을 읽어오고, 읽은 문자열을 출력합니다.
마지막으로 close() 메서드를 호출하여 BufferedReader를 닫아줍니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
// 입력을 받기 위한 BufferedReader 객체 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 출력을 위한 BufferedWriter 객체 생성
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// StringTokenizer를 사용하기 위한 객체 생성
StringTokenizer st;
// 테스트 케이스의 개수를 입력으로 받음
int t = Integer.parseInt(br.readLine());
// 테스트 케이스의 개수만큼 반복
for(int i = 0; i < t; i++) {
// 한 줄을 읽고 공백을 기준으로 문자열을 토큰으로 나눔
st = new StringTokenizer(br.readLine());
// 첫 번째 숫자를 읽어와서 정수로 변환하여 변수 a에 저장
int a = Integer.parseInt(st.nextToken());
// 두 번째 숫자를 읽어와서 정수로 변환하여 변수 b에 저장
int b = Integer.parseInt(st.nextToken());
// a와 b를 더한 결과를 문자열로 변환하여 BufferedWriter에 기록
bw.write((a+b) + "\n");
}
// 출력 버퍼를 비움
bw.flush();
// 입력 버퍼를 닫음
br.close();
// 출력 버퍼를 닫음
bw.close();
}
}
Scanner 사용하다가 BufferedReader로 하려니까 적응이 안되네요;
import문부터가 더럽게 길어졌는데... import java.io.*; 로 편하게 쓰는 방법도 있습니다!
- readLine(); 메서드를 사용해 입력하는데, String으로 리턴 값이 고정돼있기 때문에 내가 입력받고자 하는 값이 다른 타입이라면 반드시 형변환을 해주어야 합니다. => Integer.parseInt();
- BufferReader는 한 라인을 그대로 읽어오기 때문에 StringTokenizer를 사용해 BufferReader를 통해 읽어온 데이터를 공백 단위로 가공해주는 작업을 합니다. => st = new StringTokenizer(br.readLine(), " ");
- StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있습니다.
- Scanner와 달리 IOException 예외처리를 해주어야 합니다.
- try catch문으로 하거나
- throws Exception으로 처리해주면 됩니다.
💡 BufferedReader 의 경우 close() 메소드를 명시해주지 않아도 Garbage Collector에 의해 BufferedReader 및 내부의 객체들이 자동으로 정리됩니다. 즉, close()를 콜해주지 않아도 문제는 없습니다.
💡 BufferedWriter의 경우 writing을 끝낸 후 적절하게 close()를 해주지 않는다면 정상적으로 writing이 되지 않는 경우가 많습니다.