SW 공부노트
[백준] 단계별로 풀어보기 3. 반복문 본문
세 번째 단계는 for, while 등의 반목문을 사용한다.
단계별로 풀어보기 3. 반복문(https://www.acmicpc.net/step/3)
3단계는 총 14문제로 구성되어 있다.
1. 구구단(2739)
첫 번째 문제는 N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하는 문제!
정말 간단해서 설명도 쓸 게 없다..
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
for(int i=1; i<=9; i++) {
System.out.println(a + " * " + i + " = " + a * i);
}
sc.close();
}
}
2. A+B - 3(10950)
이번 문제는 두 정수를 입력받은 뒤 합을 출력하는 문제이다.
첫째 줄에 테스트 케이스의 개수 T를 입력한 뒤, 두 정수를 T번 입력하면 된다.
T X 2 크기의 배열을 선언해 배열에 계산할 정수값을 넣어주고 반복문을 통해 합을 계산하였다.
지금까지는 사용자 입력에 Scanner를 사용하고 있지만 곧 BufferedReader를 사용할 예정!
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int index = num*2;
int n[] = new int [index];
for(int i = 0; i < index; i++) {
n[i] = sc.nextInt();
}
for(int j = 0; j < index; j += 2) {
System.out.println(n[j]+n[j+1]);
}
sc.close();
}
}
3. 합(8393)
n이 주어졌을 때, 1부터 n까지의 합을 구하는 간단한 문제!
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int sum=0;
int num = sc.nextInt();
for(int i=1;i<=num;i++)
sum += i;
System.out.print(sum);
}
}
4. 빠른 A+B(15552)
본격적으로 for문 문제를 풀기 전에 보다 빠른 입출력을 위해 입출력 방식을 바꾸기로!
문제에 언어별로 설명을 써놔주셔서 참고해서 풀었다.
나는 Java를 사용하고 있어서 BufferedReader와 BufferedWriter를 사용하였다.
BufferedReader의 readLine()을 통해 한줄을 입력받고, StringTokenizer를 통해 문자를 구분해주었다.
nextToken()을 이용하면 구분된 문자를 순차적으로 얻을 수 있다.
+) BufferedReader와 BufferedWriter를 사용하려면 try/catch 또는 throw문을 추가해줘야 한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
for(int i=0; i<num; i ++) {
st = new StringTokenizer(br.readLine());
bw.write(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken())+"\n");
}
bw.close();
}
}
5. N 찍기(2741)
자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 문제
기본적인 반복문 문제 중 하나이다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
for(int i=1; i<=num; i ++) {
bw.write(i+"\n");
}
bw.flush();
}
}
6. 기찍 N(2742)
5번 문제를 조금 변형한 형태로 조건문의 초기화식, 조건식, 증감식만 수정해주면 된다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
for(int i=num; i>=1; i--) {
bw.write(i+"\n");
}
bw.flush();
}
}
7. A+B - 7(11021)
주어진 정수의 합을 반환하는 문제의 변형된 형태이다.
각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력하면 된다.
Case #1: 2, Case #2: 5 이런 식으로 출력하면 완성
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
for(int i=0; i<num; i ++) {
st = new StringTokenizer(br.readLine());
bw.write("Case #"+(i+1)+": "+(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken()))+"\n");
}
bw.close();
}
}
8. A+B - 8(11022)
이전 문제보다 더 아름답게 출력하는 문제란다.
각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력하면 된다.
입력된 A, B값을 변수에 담아 출력하는 형식으로 수정하였다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
for(int i=0; i<num; i ++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
bw.write("Case #"+(i+1)+": "+ a + " + " + b + " = "+
(a+b)+"\n");
}
bw.close();
}
}
9. 별 찍기 - 1(2438)
이번 문제도 대표적인 반복문 예제 중 하나이다.
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제를 작성하면 된다.
이중 반복문을 사용해 행수에 맞게 별을 출력하였다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
for(int i=1; i<=num; i ++) {
for(int j=0;j<i;j++) {
bw.write("*");
}
bw.write("\n");
}
bw.close();
}
}
10. 별 찍기 - 2(2439)
변형된 별 찍기 문제
이전 문제와 같이 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍으면 되지만
오른쪽을 기준으로 정렬해 출력하면 된다.
이전 문제의 답변에서 이중 반복문 내부의 반복문을 수정해주었다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
for(int i=1; i<=num; i ++) {
for(int j=num;j>i;j--) {
bw.write(" ");
}
for(int j=0;j<i;j++) {
bw.write("*");
}
bw.write("\n");
}
bw.close();
}
}
11. X보다 작은 수
이번 문제는 정수 N개로 이루어진 수열 A와 정수 X가 주어졌을 때, A에서 X보다 작은 수를 모두 출력하는 문제이다.
첫째 줄에 N과 X가 주어지고, 둘째 줄에는 수열 A를 이루는 정수 N개가 주어진다.
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다.
값의 크기를 비교해야 하기 때문에 if문도 같이 사용된다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String num = br.readLine();
StringTokenizer st = new StringTokenizer(num, " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
StringTokenizer nums = new StringTokenizer(br.readLine(), " ");
for(int i=0;i<a;i++) {
int n = Integer.parseInt(nums.nextToken());
if(n<b)
bw.write(n+" ");
}
bw.close();
}
}
12. A+B - 5(10952)
이번 문제는 케이스의 개수를 입력받지 않고 사용자가 마지막에 0을 두개 입력하면 값을 출력하는 문제이다.
입력값이 0일 경우 break문을 통해 무한반복문을 벗어나도록 작성하였다.
무한반복문을 작성하는 방법을 여러가지지만 그 중 while문을 사용하였다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while(true) {
String num = br.readLine();
StringTokenizer st = new StringTokenizer(num, " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if(a == 0 && b == 0)
break;
bw.write(a+b+"\n");
}
bw.flush();
}
}
13. A+B - 4(10951)
이전 문제에서 더 심화된 문제!
이번에는 입력이 끝났음을 명시하지 않고 합을 출력하는 문제이다.
문제 설명에 EOF가 써져있었는데, EOF는 "End of File"의 약자로 데이터 소스로부터 더 이상 읽을 데이터가 없음을 나타낸다.
EOF를 구별하기 위해 while문에 readLine()을 통해 받은 값이 null이 아닐 경우에만 실행되도록 하였다.
readLine()을 통해 받은 값이 null일 경우 실행이 종료된다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
String str;
while( (str=br.readLine()) != null ){
st = new StringTokenizer(str," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
sb.append(a+b).append("\n");
}
System.out.print(sb);
}
}
14. 더하기 사이클(1110)
다음은 문제 설명이다.
#
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
#
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
입력받은 값의 10의 자릿수와 1의 자릿수를 구한 후 무한반복문을 실행한다.
각 자릿수의 합이 처음 입력값과 같을 때 break문을 실행한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int sum = 1;
int a = Integer.parseInt(br.readLine());
int ten = a / 10;
int one = a % 10;
while(true) {
int result = ten + one;
ten = one;
one = result % 10;
if(a == Integer.parseInt((Integer.toString(ten) + Integer.toString(one))))
break;
sum ++;
}
System.out.print(sum);
}
}
'백준풀이' 카테고리의 다른 글
[백준/자바] 11729: 하노이의 탑 이동 순서 (0) | 2023.05.18 |
---|---|
[백준/자바] 10773번: 제로 (0) | 2023.05.17 |
[백준/자바] 1920번: 수 찾기 (0) | 2023.05.17 |
[백준] 단계별로 풀어보기 2. 조건문 (0) | 2022.07.01 |
[백준] 단계별로 풀어보기 1. 입출력과 사칙연산 (0) | 2022.06.17 |