Q1. N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 츨력 형식에 맞춰서 출력하면 된다.
입력 : 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.
출력 : 출력형식과 같게 N*1부터 N*9까지 출력한다.
✅ 백준 2739번 바로가기
import java.util.*;
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);
}
sc.close();
}
}
n으로 정수를 입력 받아 n*i를 해주면 된다. N*1부터 N*9까지이므로 i의 범위를 1~9로 했다. (i=1; i<10으로 해도 상관 없다.)
Q2. 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다.
출력 : 각 테스트 케이스마다 A+B를 출력한다.
✅ 백준 10950번 바로가기
import java.util.*;
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);
}
sc.close();
}
}
배열을 사용하지 않는 가장 기본적인 방법이다. 이렇게 작성하면 출력 예제처럼 한번에 값이 출력되는 것이 아닌 한번 입력할 때마다 값이 나오게 된다.
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int arr[] = new int[T];
for(int i=0; i<T; i++){
int A = sc.nextInt();
int B = sc.nextInt();
arr[i] = A+B;
}
sc.close();
for (int j:arr){
System.out.println(j);
}
}
}
배열을 이용하면 예제 출력처럼 배열에 결과 값을 모아놓았다가 출력하게 되어 값 입력과 출력을 따로 할 수 있게 된다.
Q3. n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
입력 : 첫째 줄에 n이 주어진다.
출력 : 1부터 n까지 합을 출력한다.
✅ 백준 8393번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int sum = 0;
int n = sc.nextInt();
for(int i=1; i<=n; i++){
sum += i;
}
sc.close();
System.out.print(sum);
}
}
합계를 저장할 변수 sum과 for문 반복 횟수를 저장할 변수 n을 선언한다. 반복문을 실행하여 i부터 n까지의 합을 sum에 저장하고 결과를 출력하면 된다.
Q4. 준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다. 영수증에 적힌, ✔️구매한 각 물건의 가격과 개수, ✔️구매한 물건들의 총 금액을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.
입력 : 첫째 줄에는 영수증에 적힌 총 금액 X가 주어진다. 둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다. 이후 N개의 줄에는 각 물건의 가격 a와 개수 b가 공백을 사이에 두고 주어진다.
출력 : 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.
✅ 백준 25304번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int X = sc.nextInt();
int Y = sc.nextInt();
int sum = 0;
for(int i=0; i<Y; i++){
int a = sc.nextInt();
int b = sc.nextInt();
sum += a*b;
}
sc.close();
if(sum==X){
System.out.print("Yes");
}
else{
System.out.print("No");
}
}
}
배열도 사용하지 않은 가장 기본적인 풀이이다. 물건의 가격(a)*물건의 개수(b)의 합을 변수 sum에 저장한 후 영수증에 적힌 총 금액(X)와 비교하여 Yes or No를 출력한다.
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int X = sc.nextInt();
int Y = sc.nextInt();
int sum = 0;
for(int i=0; i<Y; i++){
int a = sc.nextInt();
int b = sc.nextInt();
sum += a*b;
}
sc.close();
System.out.println(sum==X?"Yes":"No");
}
}
조건문을 생략하고 출력하는 부분을 삼항연산자로 수정한 풀이 방법이다.
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int X = sc.nextInt();
int Y = sc.nextInt();
for(int i=0; i<Y; i++){
int a = sc.nextInt();
int b = sc.nextInt();
X = X - (a*b);
}
sc.close();
System.out.println(X==0?"Yes":"No");
}
}
이 풀이는 총 금액 X에서 물건의 가격(a*b)를 빼서 0이나오면 Yes를 출력하는 방법이다.
Q5. 오늘은 혜아의 면접 날이다. 면접 준비를 열심히 해서 앞선 질문들을 잘 대답한 혜아는 이제 마지막으로 칠판에 직접 코딩하는 문제를 받았다. 혜아가 받은 문제는 두 수를 더하는 문제였다. C++ 책을 열심히 읽었던 혜아는 간단히 두 수를 더하는 코드를 칠판에 적었다. 코드를 본 면접관은 다음 질문을 했다. "만약, 입출력이 N바이트 크기의 정수라면 프로그램을 어떻게 구현해야 할까여?" 혜아는 책에 있는 정수 자료형과 관련된 내용을 기억해 냈다. 책에는 long int는 4바이트 정수까지 저장할 수 있는 정수 자료형이고 long long int는 8바이트 정수까지 저장할 수 있는 정수 자료형이라고 적혀 있었다. 혜아는 이런 생각이 들었다. "int 앞에 long을 하나씩 더 붙일 때마다 4바이트씩 저장할 수 있는 공간이 늘어나는 걸까? 분명 long long long int는 12바이트, long long long long int는 16바이트까지 저장할 수 있는 정수 자료형일 거야!" 그렇게 혜아는 당황하는 면접관의 얼굴을 뒤로한 채 칠판에 정수 자료형을 써 내려가기 시작했다. 혜아가 N바이트 정수까지 저장할 수 있다고 생각해서 칠판에 쓴 정수 자료형의 이름은 무엇일까?
입력 : 첫 번째 줄에는 문제의 정수 N이 주어진다.
출력 : 혜아가 N바이트 정수까지 저장할 수 있다고 생각하는 정수 자료형의 이름을 출력하여라.
✅ 백준 25314번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
StringBuilder sb = new StringBuilder();
for(int i=0; i<N/4; i++){
sb.append("long ");
}
sb.append("int");
System.out.println(sb);
}
}
for문을 풀이해보면 long읜 4byte이므로 N/4를 하여 몫만큼 long을 더해주면 된다. StringBuilder를 이용하여 문자열 객체를 선언하고, 조건식의 결과 값 만큼 append()메소드를 이용하여 long을 더해준다. 반복문이 끝나면 마지막에 int를 붙여서 출력한다.
✅ StringBuilder 변수명 = new StringBuilder();
✔️StringBuilder 변수명 = new StringBuilder("seongil"); 처럼 문자열을 바로 넣을 수도 있다.
✔️.append();는 문자열 뒤에 문자열을 추가하는 메소드이다.
Q6. 본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다. Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
입력 : 첫 줄에는 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
출력 : 각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
✅ 백준 15552번 바로가기
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt((br.readLine()));
StringTokenizer st;
for(int i=0; i<T; i++){
st = new StringTokenizer(br.readLine());
bw.write((Integer.parseInt(st.nextToken()))+Integer.parseInt(st.nextToken())+"\n");
}
bw.close();
}
}
✅BufferedReader = new BufferedReader(new InputStreamReader(System.in)); // 선언
✅BufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
✔️변수 T는 문자열로 받아왔으므로 정수형으로 변환하여 저장한다.
✅StringTokenizer = BufferedReader클래스의 메소드로 입력을 읽어들이면, 라인 단위로 읽어들일 수 밖에 없다. 라인 단위가 아닌 공백, 구분자 등을 통해 분리하기 위한 클래스이다. ➡️ 문자열을 토큰화 한다. 즉, 토큰은 분리된 문자열 조각으로 StringTokenizer 클래스는 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스이다.
Q7. 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다.
출력 : 각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.
✅ 백준 11021번 바로가기
import java.util.*;
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("Case #"+(i+1)+": "+(a+b));
}
}
}
for문을 for(i<1; i<=T; i++)로 수정하고 System.out.println("Case #"+i+": "+(a+b));로 해도 상관 없다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt((br.readLine()));
StringTokenizer st;
for(int i=1; i<=T; i++){
st = new StringTokenizer(br.readLine(), " ");
System.out.println("Case #" + i + ": "
+ (Integer.parseInt(st.nextToken())
+ Integer.parseInt(st.nextToken())));
}
br.close();
}
}
위의 풀이는 BufferedReader를 이용한 풀이이다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt((br.readLine()));
StringTokenizer st;
for(int i=1; i<=T; i++){
st = new StringTokenizer(br.readLine());
bw.write("Case #"+i+": "+(Integer.parseInt(st.nextToken()))+Integer.parseInt(st.nextToken())+"\n");
}
bw.close();
}
}
위의 풀이는 BufferedReader와 BufferedWriter를 이용한 풀이인데. 백준에서는 정답으로 인정되지 않는다. 인텔리제이에서는 제대로 출력 된다.
Q8. 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력 : 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다.
출력 : 각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.
✅ 백준 11022번 바로가기
import java.util.*;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int i=1; i<=T; i++){
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println("Case #"+i+": "+a+" + "+b+" = "+(a+b));
}
}
}
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
int A,B;
StringTokenizer st;
for(int i=1; i<=T; i++){
st = new StringTokenizer(br.readLine(), " ");
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
System.out.println("Case #"+i+": "+A+" + "+B+" = "+(A+B));
}
}
}
Q9. 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
입력 : 첫째 줄에 N이 주어진다.
출력 : 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
✅ 백준 2438번 바로가기
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
sc.close();
for(int i=1; i<=num; i++){
for(int j=1; j<=i; j++){
System.out.print("*");
}
System.out.println();
}
}
}
for문을 풀어서 해석해보자.
for(int j=1; j<=1; j++) {System.out.print("*")} System.out.println(); // *
for(int j=1; j<=2; j++) {System.out.print("*")} System.out.println(); // **
for(int j=1; j<=3; j++) {System.out.print("*")} System.out.println(); // ***
for(int j=1; j<=4; j++) {System.out.print("*")} System.out.println(); // ****
for(int j=1; j<=5; j++) {System.out.print("*")} System.out.println(); // *****
위 문장들을 보면 조건식의 숫자만 변할 뿐 나머지는 같다. 똑같은 내용이 반복되므로 반복문으로 표현하면
for(int j=1; j<=i; j++) {System.out.print("*")} System.out.println(); 으로 표현하면 된다.
import java.util.*;
import java.io.*;
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());
br.close();
for(int i=1; i<=N; i++){
for(int j=1; j<=i; j++){
System.out.print("*");
}
System.out.println();
}
}
}
BufferedReader 를 이용한 풀이이다.
Q10. 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제이다. 하지만, 오른쪽을 기준으로 정렬한 별을 출력하시오.
입력 : 첫째 줄에 N이 주어진다.
출력 : 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다. (오른쪽을 기준으로 정렬)
✅ 백준 2439번 바로가기
import java.util.*;
import java.io.*;
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());
br.close();
for(int i=1; i<=N; i++){
for(int j=1; j<=N-i; j++){
System.out.print(" ");
}
for(int k=1; k<=i; k++){
System.out.print("*");
}
System.out.println();
}
}
}
✔️먼저 1행부터 N행까지 출력을 하기 위한 메인 for문을 작성한다. for(int i=1; i<=N; i++){}
✔️N이 3이라고 가정하면 첫번째 행에는 공백 2개와 *이 1개가 와야한다. 두번째 행에는 공백 1개와 *이 2개가 와야한다. 마지막 행에는 공백 0개와 *이 3개가 와야한다. 즉, n번째 행에는 N-n개의 공백이 출력되고, 별은 n개가 출력되야한다. i가 행이므로 N-i만큼 공백을 출력해야한다. 따라서 공백을 위한 for문은 (int j=1; j<=N-i; j++){}이 된다.
✔️각 행에 별은 n개가 출력되므로 별 출력을 위한 for문은 for (int k=1; k<=i; k++){} 가 된다.
Q11. 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력 : 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
출력 : 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. 입력의 마지막에는 0 두 개가 들어온다.
✅ 백준 10952번 바로가기
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
while(true){
st = new StringTokenizer(br.readLine(), " ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
if(A==0 && B==0)
break;
else{
System.out.println(A+B);
}
}
br.close();
}
}
while문의 조건식을 true로 설정하여 특정 조건 (A==0 && B==0)을 만족할 때까지 무한반복하도록 만든다. 특정 조건을 만족하면 break문을 통해 while문을 벗어나 반복을 종료한다.
Q12. 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력 : 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에는 A와 B가 주어진다.
출력 : 각 테스트 케이스마다 A+B를 출력한다.
✅ 백준 10951번 바로가기
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
sc.close();
while(sc.hasNextInt()){
int A = sc.nextInt();
int B = sc.nextInt();
System.out.println(A+B);
}
}
}
Scanner를 이용한 풀이이다. while의 조건식에 hasNextInt()메소드를 사용하여 정수가 아닌 다른 문자가 오면 반복문을 종료하도록 만들었다.
✅hasNextInt() : 입력 값이 정수이면 true를, 정수가 아니면 false를 반환한다.
'백준 문제풀이 > 단계별 문제 풀이 (Basic-Java)' 카테고리의 다른 글
05. 문자열 (0) | 2023.03.06 |
---|---|
04. 1차원 배열 (0) | 2023.03.01 |
02. 조건문 (0) | 2023.02.15 |
01. 입출력과 사칙연산 (0) | 2023.02.13 |