[단계별로 풀어보기-Java] 1단계 입출력과 사칙연산 (2) - BufferedReader, StringBuilder 활용하기
안녕하세요 이번 포스터는 1단계 입출력과 사칙연산 2탄입니다.
1탄은 아래 포스터를 확인해주세요 ~
[단계별로 풀어보기-Java] 1단계 입출력과 사칙연산 (1) - BufferedReader, System.in 활용하기
문제 번호 : 2557Hello World!를 출력하시오.public class Main { public static void main(String[] args) { System.out.print("Hello World!"); }} 문제 번호 : 1000두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성
uplifted.tistory.com
✏️ 문제 번호 : 10869
두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오.
입력
두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000)
출력
첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A*B, 넷째 줄에 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();
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(a%b);
}
}
BufferedReader, StringBuilder 사용해서 메모리를 줄이고 속도 높이기
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));
String[] input = br.readLine().split(" ");
int a = Integer.parseInt(input[0]);
int b = Integer.parseInt(input[1]);
StringBuilder sb = new StringBuilder();
sb.append(a + b).append("\n")
.append(a - b).append("\n")
.append(a * b).append("\n")
.append(a / b).append("\n")
.append(a % b);
System.out.print(sb);
}
}
코드 개선 포인트
(1) BufferedReader로 입력 처리
BufferedReader는 입력을 한 번에 읽어 메모리를 적게 사용하고 속도가 빠릅니다.
입력된 값을 공백(split(" "))으로 나누어 처리합니다.
(2) StringBuilder로 출력 처리
여러 번의 System.out.println 호출 대신 StringBuilder를 사용해 모든 결과를 한 번에 출력합니다.
문자열 추가와 출력이 효율적입니다.
(3) 중간 변수 최소화
모든 계산을 한 줄씩 StringBuilder에 바로 추가하여 중간 변수 생성을 줄였습니다.
✏️ 문제 번호 : 10926
준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.
출력
첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
System.out.println(a + "??!");
}
}
BufferedReader 사용해서 메모리를 줄이고 속도 높이기
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));
String username = br.readLine(); // 아이디 입력 받기
System.out.println(username + "??!"); // 놀람 출력
}
}
✏️ 문제 번호 : 18108
ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.
불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.
입력
서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)
출력
불기 연도를 서기 연도로 변환한 결과를 출력한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = n - 543;
System.out.print(m);
}
}
BufferedReader 사용해서 메모리를 줄이고 속도 높이기
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 n = Integer.parseInt(br.readLine()); // 입력 값을 정수로 변환
System.out.print(n - 543); // 바로 계산 및 출력
}
}
✏️ 문제 번호 : 10430
(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?
(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?
세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)
출력
첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt();
System.out.println((a+b)%c);
System.out.println(((a%c)+(b%c))%c);
System.out.println((a*b)%c);
System.out.println(((a%c)*(b%c))%c);
}
}
BufferedReader, StringBuilder 사용해서 메모리를 줄이고 속도 높이기
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));
String[] input = br.readLine().split(" ");
int a = Integer.parseInt(input[0]);
int b = Integer.parseInt(input[1]);
int c = Integer.parseInt(input[2]);
StringBuilder sb = new StringBuilder();
sb.append((a + b) % c).append("\n")
.append((a % c + b % c) % c).append("\n")
.append((a * b) % c).append("\n")
.append((a % c * b % c) % c);
System.out.print(sb);
}
}
✏️ 문제 번호 : 2588
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.
출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] num1 = new int[3];
int[] num2 = new int[3];
String first = sc.nextLine();
for (int i = 0; i < 3; i++) {
num1[i] = first.charAt(i) - '0';
}
String second = sc.nextLine();
for (int i = 0; i < 3; i++) {
num2[i] = second.charAt(i) - '0';
}
int firstSum = (num1[2] * num2[2]) + (num1[1] * num2[2] * 10) + (num1[0] * num2[2] * 100);
int secondSum = (num1[2] * num2[1]) + (num1[1] * num2[1] * 10) + (num1[0] * num2[1] * 100);
int thirdSum = (num1[2] * num2[0]) + (num1[1] * num2[0] * 10) + (num1[0] * num2[0] * 100);
System.out.println(firstSum);
System.out.println(secondSum);
System.out.println(thirdSum);
System.out.println(firstSum + (secondSum*10) + (thirdSum*100));
}
}
BufferedReader 사용해서 메모리를 줄이고 속도 높이기
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String num1 = br.readLine();
String num2 = br.readLine();
int a = num1.charAt(0) - '0', b = num1.charAt(1) - '0', c = num1.charAt(2) - '0';
int d = num2.charAt(0) - '0', e = num2.charAt(1) - '0', f = num2.charAt(2) - '0';
int firstSum = c * f + b * f * 10 + a * f * 100;
int secondSum = c * e + b * e * 10 + a * e * 100;
int thirdSum = c * d + b * d * 10 + a * d * 100;
int totalSum = firstSum + secondSum * 10 + thirdSum * 100;
System.out.println(firstSum);
System.out.println(secondSum);
System.out.println(thirdSum);
System.out.println(totalSum);
}
}