일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- slidePerView
- realIndex
- watchOverflow
- display
- eslint
- JavaScript
- loop:true
- 인덱스
- swiper
- javascirpt
- CORS
- activeIndex
- v-bind
- Vue
- slideChange
- jquery
- classlist
- vue2
- swiperOption
- js
- slidePerGroup
- vscode
- css
- centerSlides
- error
- archiver
- index
- prettier
- eslint prettier
- querySelector
- Today
- Total
코딩하는 둥둥
[ 백준 Baekjoon / JAVA ] 단계별로 풀어보기_3.반복문 본문
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오.
출력 형식에 맞춰서 출력하면 된다.
- 입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.
- 출력
출력형식과 같게 N*1부터 N*9까지 출력한다.
https://www.acmicpc.net/problem/2739
2739번: 구구단
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.
www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 < 10; i++) {
int M = N*i;
System.out.println(N + " * " + i + " = " + M);
}
}
}
|
cs |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
- 입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
- 출력
각 테스트 케이스마다 A+B를 출력한다.
https://www.acmicpc.net/problem/10950
10950번: A+B - 3
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
1. 맨 첫째 줄에 입력하는 T는 테스트 케이스의 개수
2. 테스트케이스를 진행시, 입력받은 A와 B를 이용해 A+B를 테스트 케이스의 수 만큼 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.util.*;
public class Main {
public static void main(String[] args) { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
Scanner sc = new Scanner(System.in); /* 값을 입력 받기 위해 Scanner 객체 sc를 선언한다. */
int T = sc.nextInt(); // testcase의 개수
for(int i = 1; i <= T; i++) {
int A = sc.nextInt();
int B = sc.nextInt();
System.out.println(A+B);
}
sc.close(); /* Scanner 함수의 사용이 종료되었으므로 객체 sc를 종료해서 메모리에서 반환되게 한다. */
}
}
|
cs |
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
- 입력
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.
- 출력
1부터 n까지 합을 출력한다.
https://www.acmicpc.net/problem/8393
8393번: 합
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.util.*;
public class Main {
public static void main(String[] args) { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
Scanner sc = new Scanner(System.in); /* 값을 입력 받기 위해 Scanner 객체 sc를 선언한다. */
int n = sc.nextInt();
int result = 0;
for(int i = 1; i <= n; i++) { // i가 n보다 작거나 같을때까지 for문을 돌림
result += i; // => result = i + result
}
System.out.println(result);
sc.close(); /* Scanner 함수의 사용이 종료되었으므로 객체 sc를 종료해서 메모리에서 반환되게 한다. */
}
}
|
cs |
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.
Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.
이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.
- 입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
- 출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
- 시간 제한
Java 8: 1.5 초Java 8 (OpenJDK): 1.5 초
https://www.acmicpc.net/problem/15552
15552번: 빠른 A+B
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
www.acmicpc.net

이 문제를 풀면서 다양한 에러를 볼수 있었다..ㅎ

→ 런타임 에러 (NumberFormatException) 발생 : 숫자 형식 오류
이클립스에서는 오류가 발생하지 않았는데 백준에서는 에러가 발생해서 당황했다.
추측한 바로는 A와 B를 입력받을때 Integer.parseInt(br.readLine())으로 엔터로 구분되게 입력받았는데 아마 이 부부에서 문제가 발생한것 같았다.
그래서 A B의 배열로 입력받은 다음 split(" ")을 이용해 공백을 기준으로 문자열을 잘라 사용하도록 구현하였다.
이 블로그를 참고했다.
https://m.blog.naver.com/zzang9ha/221728173726

→ 런타임 에러 (IO) 발생
이렇게 작성한 이후로는 IOException이 발생했다.
엔터를 누를때마다 더한 값이 바로 출력되는 형식으로 구상했기때문에 for문 안에 bw.flush를 넣어서 작성했는데 이 부분에서 문제가 발생했다.
그래서 for문 밖으로 bw.flush와 bw.close를 이동시켰고 성공했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
// 콘솔에서 입력받을 경우
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 출력
try { // BufferedReader사용시 ㄴ예외처리 필수! (or throwsIOException)
int T = Integer.parseInt(br.readLine()); // 테스트케이스의 개수 : BufferedReader는 String이 return값이기때문에 형변환 필수
int A, B; // 두 정수
for(int i = 0; i < T; i++) {
// 문자열을 입력받고 공백기준으로 잘라서 A와 B의 값 넣기
String[] list = br.readLine().split(" ");
// 자른 문자열을 다시 int로 변환
A = Integer.parseInt(list[0]);
B = Integer.parseInt(list[1]);
bw.write(Integer.toString(A+B)+"\n"); // bufferedWriter이 string타입으로 반환되기때문에 toString을 이용해 형변환
}
bw.flush(); // 남아있는 데이터를 모두 출력시킴
bw.close(); // 스트림 닫기 : 여기서 닫아주지 않으면 시간 초과 발생
br.close(); // 입출력이 끝난 후 닫아주기
} catch (NumberFormatException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
cs |
자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
- 입력
첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.
- 출력
첫째 줄부터 N번째 줄 까지 차례대로 출력한다.
https://www.acmicpc.net/problem/2741
2741번: N 찍기
자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
www.acmicpc.net
처음에는 이렇게 작성했었는데 원하는대로 1씩 더해지지 않고 2씩 더해져서 출력되었다.
![]() |
![]() |
그래서 1씩 출력될수 있도록 새로운 변수 j를 선언해 for문이 반복될때마다 j에 1이 더해질수 있도록 작성하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int j = 1;
for(int i = 1; i <= N; i++) {
System.out.println(j);
j = j + 1;
}
}
}
|
cs |
자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
- 입력
첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.
- 출력
첫째 줄부터 N번째 줄 까지 차례대로 출력한다.
https://www.acmicpc.net/problem/2742
2742번: 기찍 N
자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int j = N;
for(int i = 1; i <= N; i++) {
System.out.println(j);
j = j - 1;
}
}
}
|
cs |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
- 입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
- 출력
각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다.
테스트 케이스 번호는 1부터 시작한다.
https://www.acmicpc.net/problem/11021
11021번: A+B - 7
각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.
www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine()); // 테스트케이스 개수
int A, B;
for(int x = 1; x <= T; x++) {
String[] list = br.readLine().split(" ");
A = Integer.parseInt(list[0]);
B = Integer.parseInt(list[1]);
bw.write("Case #"+ x + ": " + Integer.toString(A+B) + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
|
cs |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
- 입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
- 출력
각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다.
x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.
https://www.acmicpc.net/problem/11022
11022번: A+B - 8
각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.
www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine()); // 테스트케이스 개수
int A, B;
String a, b;
for(int x = 1; x <= T; x++) {
String[] list = br.readLine().split(" ");
A = Integer.parseInt(list[0]);
B = Integer.parseInt(list[1]);
a = Integer.toString(A);
b = Integer.toString(B);
bw.write("Case #"+ x + ": " + a + " + " + b + " = " + Integer.toString(A+B) + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
|
cs |
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
- 입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
- 출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
https://www.acmicpc.net/problem/2438
2438번: 별 찍기 - 1
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException { /* 접근제어자 public. 반환값이 없도록 main 함수를 선언한다. */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine()); // 최대 별의 개수
String star = "*";
for(int i = 1; i <= N; i++) { // 1부터 N행까지 출력
for(int j = 1; j <= i; j++) { // i의 수만큼 *찍기
bw.write(star);
}
bw.write("\n"); // 줄바꿈을 위해 삽입
}
br.close();
bw.flush();
bw.close();
}
}
|
cs |
※ BufferedReader와 BufferedWriter을 사용했을 경우 Scanner에 비해 속도적인 부분에서 향상되지만 개행(줄바꿈)을 할 경우 write("\n") 이나 newLine() 함수를 사용해야 한다.
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
- 입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
- 출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
https://www.acmicpc.net/problem/2439
2439번: 별 찍기 - 2
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
www.acmicpc.net
![]() |
N이 5라고 가정했을 경우 ▶ i가 1일때 - j가 1일 경우 : 공백 1번 출력 → 4번(N-i번) 반복 - k가 1일 경우 : * 1번 출력 → (i번) ▶ i가 2일때 - j가 1일 경우 : 공백 1번 출력 → 3번(N-i번) 반복 - k가 1일 경우 : * 1번 출력 → 2번(i번) 반복 ▶ i가 3일때 - j가 1일 경우 : 공백 1번 출력 → 2번(N-i번) 반복 - k가 1일 경우 : * 1번 출력 → 3번(i번) 반복 ▶ i가 4일때 - j가 1일 경우 : 공백 1번 출력 → 1번(N-i번) 반복 - k가 1일 경우 : * 1번 출력 → 4번(i번) 반복 ▶ i가 5일때 - j가 1일 경우 : 공백 출력X - k가 1일 경우 : * 1번 출력 → 5번(i번) 반복 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine()); // 최대 별의 개수
String star = "*";
int i;
int j;
int k;
for(i = 1; i <= N; i++) { // 1부터 N열까지 출력
// 공백 출력 : 전체 행의 개수에서 별의 개수를 빼고 출력
for(j = 1; j <= N-i; j++) {
bw.write(" ");
}
// 별의 개수 : i의 값만큼 출력
for (k = 1; k <= i; k++) {
bw.write(star);
}
bw.write("\n"); // 줄바꿈을 위해 삽입
}
br.close();
bw.flush();
bw.close();
}
}
|
cs |
정수 N개로 이루어진 수열 A와 정수 X가 주어진다.
이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
- 입력
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)둘째 줄에 수열 A를 이루는 정수 N개가 주어진다.
주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
- 출력
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
https://www.acmicpc.net/problem/10871
10871번: X보다 작은 수
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
www.acmicpc.net


정수의 개수만 입력받고 N개의 정수들이 랜덤값으로 들어간다는 생각으로 구현했는데 다시 예제 입력 부분을 보니 N개의 정수들도 입력받아야 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int I = 1;
int N, X;
for(int i = 0; i < I; i++) {
// 주어진 정수의 개수와 기준값
String[] inputList = br.readLine().split(" ");
N = Integer.parseInt(inputList[0]);
X = Integer.parseInt(inputList[1]);
// 입력받은 N개의 값 배열에 저장
String[] list = br.readLine().split(" ");
int[] array = new int[N]; // N개의 정수
for(int j = 0; j < N; j++) {
array[j] = Integer.parseInt(list[j]);
if(array[j] < X) { // 입력받은 값이 X보다 작은값 출력
bw.write(Integer.toString(array[j]) + " ");
}
}
}
br.close();
bw.flush();
bw.close();
}
}
|
cs |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
- 입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
입력의 마지막에는 0 두 개가 들어온다.
- 출력
각 테스트 케이스마다 A+B를 출력한다.
https://www.acmicpc.net/problem/10952
10952번: A+B - 5
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
// 조건 : 입력의 마지막에는 0 두 개가 들어온다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int A, B;
while(true) {
String[] inputList = br.readLine().split(" ");
A = Integer.parseInt(inputList[0]);
B = Integer.parseInt(inputList[1]);
if(A == 0 && B == 0) { // A와 B가 0일때 반복문 break
break;
}else {
bw.write(Integer.toString(A+B)+"\n"); // 아닐경우 A+B를 출력
}
}
br.close();
bw.flush();
bw.close();
}
}
|
cs |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
- 입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
- 출력
각 테스트 케이스마다 A+B를 출력한다.
https://www.acmicpc.net/problem/10951
10951번: A+B - 4
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
10952와는다르게 입력이 끝나는 조건이 따로 나와있지 않아서 아무것도 입력되지 않았을때를 입력이 끝나는 조건으로 설정하였다.


첫번째 코드는 틀렸고 두번째 코드에서는 출력 초과가 발생했다.
아무것도 입력하지 않았을때를 종료 조건으로 하기위해 입력받은 string값이 null이 아닐때 while문이 돌아가도록 코딩했는데, 이클립스에서 실행해봤을때는 이렇게 한 항목이 계속해서 반복되었기때문에 당연히 출력초과가 되었을것이다.

이 문제를 풀기위해서는 EOF에 대해 알아야 했는데 자세한 내용은 이 블로그를 참고했다.
https://steady-coding.tistory.com/227
EOF의 사용 방법을 알아보자 (JAVA)
안녕하세요? 코딩중독입니다. 저번 시간에는 입출력의 속도를 빠르게 해 주는 BufferedReader와 BufferedWriter에 대해 알아보았습니다. 이번에는 EOF가 무엇인지 알아봅시다. EOF는 무엇일까? EOF는 End of F
steady-coding.tistory.com
BufferdReader의 경우 Scanner와 다르게 EOF를 처리하는 내장함수가 없기때문에 br.readLine()으로 입력값을 계속 읽되, 읽은 값이 null이 되면 반복문을 종료하는 방식으로 처리했다.

→ NumberFormatException 발생
: 문자열을 변화할때 숫자열이 아니라서 발생한다.
여기서는 A와 B를 입력하고 null이 입력될수 있도록 엔터를 두번 눌렀을때 마지막 엔터("")를 integer로 변환하려고해서 발생했다.
그래서 StringTokenizer와 if문을 이용해 StringTokenizer이 토큰이 더 있을 경우 A와 B를 더하고 그렇지 않을 경우 반복문이 종료되도록 했다.
* StringTokenizer : https://jhnyang.tistory.com/398

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
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));
StringTokenizer st;
int A, B;
String input;
// 반복의 횟수가 정해지지 않았음 = while 사용
while((input = br.readLine()) != null ) { // EOF
st = new StringTokenizer(input, " ");
if(st.hasMoreTokens()) {
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
bw.write(A+B+"\n");
} else {
break;
}
}
br.close();
bw.flush();
bw.close();
}
}
|
cs |
[ 참고 블로그 ]
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의 사이클의 길이를 구하는 프로그램을 작성하시오.
- 입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.
- 출력
첫째 줄에 N의 사이클 길이를 출력한다.
https://www.acmicpc.net/problem/1110
1110번: 더하기 사이클
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,
www.acmicpc.net

▶ 새로운 숫자의 10의 자리 값 : 기존 입력값의 1의 자리 값
▶ 새로운 숫자의 1의 자리 값 : 기존 입력값의 10의 자리와 1의 자리를 더한 값의 1의 자리 값
이때 기존 입력값인 N이 다시 돌아올때까지 이것을 반복한다.

- 기존 1의 자리(one) : N % 10
- 기존 10의 자리(ten) : (N - one) / 10
= (N - (N % 10)) / 10
- 새로운 숫자 : (one * 10) // 새로운 숫자의 10의 자리 = 기존 1의 자리 * 10
+ ((ten + one) % 10) // 기존 숫자의 10의 자리 + 1의 자리의 1의 자리
= ((N % 10) * 10)
+ ((((N - (N % 10)) / 10) + (N % 10)) % 10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int copy = N;
int count = 0;
while(true) {
// N의 값을 새로운 값으로 저장
N = ((N % 10)*10) + ((((N - (N % 10))/10) + (N % 10))%10);
count++;
if(N==copy) { // 기존의 N의 값(=copy)가 N의 값과 같을때 반복문 break
break;
}
}
System.out.println(count);
}
}
|
cs |
'Backend > 백준' 카테고리의 다른 글
[ 백준 Baekjoon / JAVA ] 2562번 : 최댓값 (0) | 2022.05.11 |
---|---|
[ 백준 Baekjoon / JAVA ] 10818번 : 최소, 최대 (1차원 배열) (0) | 2022.05.03 |
[ 백준 Baekjoon / JAVA ] 25083번 : 새싹 (입출력과 사칙연산) (0) | 2022.05.01 |
[ 백준 Baekjoon ] 단계별로 풀어보기_2.조건문 (0) | 2022.04.04 |
[ 백준 Baekjoon ] 단계별로 풀어보기_1.입출력과 사칙연산 (0) | 2022.03.25 |