백준 2438
별을 따다 – 1
(BufferedReader로 응답)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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.readLine() 문자형
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
system.off.누르다(“*”);
}
System.out.println(); // 한줄바꿈
내부 for 문에서 j는 i의 값만큼 반복됩니다.
나는 = 1, j = 1 * 나는 = 2, j = 2 **
고려해야 할 사항 system.off.누르다(“*”); 줄바꿈 없이 텍스트를 인쇄하려면 인쇄
(StringBuilder로도 답변)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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.readLine() 문자형
StringBuilder sb = new StringBuilder();
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
sb.append("*");
}
sb.append("\n");
}
System.out.println(sb); // System.out.print(sb) 도 정답
}
}
백준 2439
슈팅 스타 – 2
(BufferedReader로 응답)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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.readLine() 문자형
for(int i=1; i<=n; i++) {
for(int m=1; m<=n-i; m++) {
System.out.print(" ");
}
for(int j=1; j<=i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
System.out.print()를 호출하는 데 시간이 오래 걸리는 경우가 많습니다.
StringBuilder 이용하여 시간을 절약하자
(BufferedReader + StringBuilder 사용한 정답)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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.readLine() 문자형
StringBuilder sb = new StringBuilder();
for(int i=1; i<=n; i++) {
for(int m=1; m<=n-i; m++) {
sb.append(" ");
}
for(int j=1; j<=i; j++) {
sb.append("*");
}
sb.append("\n");
}
System.out.println(sb);
}
}
위 버퍼링된 리더 만 사용
BufferedReader 아래 + StringBuilder 사용
시차가 2배 이상!
백준 10952
A + B-5
잘못된 답변 (BufferedReader + StringBuilder)
A와 B를 한 줄에 입력합니다.
공백이 포함되어 있기 때문에 오류가 발생했습니다.
무슨 일이에요
그리고 A와 B가 0 0이면 입력은 출력 없이 끝나야 합니다.
if 절 뒤에 sb. 추가(A+B); 넣어야
따라서 sb.append가 break 위에 있으면 0 0 0을 입력하면 반환됩니다.
public class Main {
public static void main(String() args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while(true) {
int A = Integer.parseInt(br.readLine()); //br.readLine() 문자형
int B = Integer.parseInt(br.readLine()); //br.readLine() 문자형
if (A==0 && B==0) {
break; // if문 참이 아니면 종료
}
sb.append(A+B);
}
System.out.println(sb);
}
}
(StringTokenizer 공백을 기반으로 문자열을 알려줍니다.
)
이제 1 2의 입력에는 공백이 포함되지 않으므로 오류가 없습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String() args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
while(true) {
st = new StringTokenizer(br.readLine()," ");
int A = Integer.parseInt(st.nextToken()); //br.readLine() 문자형
int B = Integer.parseInt(st.nextToken()); //br.readLine() 문자형
if (A==0 && B==0) {
break; // if문 참이 아니면 종료
}
sb.append(A+B).append("\n");
}
System.out.println(sb);
}
}
백준 10951
A + B-4
종료 조건은 없고 입력만 있습니다.
입력의 끝은 EOF = 더 이상 읽을 데이터가 없을 때 끝입니다.
EOF란?
End Of File = 입력에서 더 이상 읽을 데이터가 없을 때 파일의 끝
EOF를 다루는 방법?
- 스캐너에서 try-catch 문 또는 hasNext() 또는 hasNextInt() 메서드 사용
- 따라서 BufferedReader는 null을 반환합니다.
null인지 여부는 조건문으로 구분되며, null을 반환하려면 Ctrl + Z 또는 Ctrl + D 입력 신호 EOF.
1. ( 스캐너가 ( hasNextInt() ) )
hasNextInt()의 경우 입력 값이 정수이면 true를 반환합니다.
정수가 아니면 false를 반환하여 루프를 종료합니다.
import java.util.Scanner;
public class Main {
public static void main(String() args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()) {
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a+b);
}
sc.close();
}
}
2. (버퍼링된 리더)
EOF 상태의 경우 null이 반환됩니다.
Variable =br.readLine() !
= null null이면 a + b를 반복한다.
0이면 루프를 종료합니다.
null임을 나타내기 위해 Ctrl+D 또는 Ctrl+Z를 입력하여 EOF를 알립니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String() args) throws IOException {
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.println(sb);
}
}
박준 1110
플러스 사이클
26의 새로운 숫자는 68입니다.
십의 자리는 26의 1의 자리입니다.
일의 자리는 2 + 6의 일의 자리입니다(또 다른 예는 4+8의 일의 자리 2).
이제 주어진 숫자(N)의 새로운 숫자(T)의 10의 자리와 1의 자리를 찾는 공식을 살펴보자.
- 십 자리
T = (N% 10) * 10 // 26% 10 곱하기 10의 나머지는 십의 자리수
- 한 곳
T = (N%10) + (N/10)%10 // 26을 10으로 나눈 나머지에 몫을 더한 다음 나머지가 1의 자리가 되도록 % 10을 더합니다.
십의 자리 + 일의 자리 = 새로운 숫자
N = ((N% 10) * 10) + (((N/10) + (N% 10)) % 10);
(BufferedReader)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String() args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine()); // 입력값
int b = a; //새로운 값
int cycle = 0;
while(true) {
a = ((a % 10) * 10) + (((a % 10) + (a / 10)) % 10);
cycle++;
if(a==b) {
System.out.println(cycle);
break;
}
}
}
}
헷갈리는 부분!
!
if 문이 완료된 후 println(cycle)이 인쇄되면 대답이 잘못된 것입니다.
if 문에 println(cycle)을 삽입하고 주기를 인쇄한 후 루프 문을 종료해야 합니다.
while(true) {
a = ((a % 10) * 10) + (((a % 10) + (a / 10)) % 10);
cycle++;
if(a==b) {
break;
}
System.out.println(cycle);
}
(if 문을 사용하지 않고 do-while 문을 사용해 보십시오.)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String() args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine()); // 입력값
int b = a; //새로운 값
int cycle = 0;
do {
a = ((a % 10) * 10) + (((a % 10) + (a / 10)) % 10);
cycle++;
}while(a!
=b);
System.out.println(cycle);
}
}
동안(a!
=b);
a와 새 숫자 b가 같지 않으면 루프가 종료되고 println(cycle)이 인쇄됩니다.