백준 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.out.print("*");
}
System.out.println(); // 한 줄 바꿈
내부 for문의 j 는 i 의 값만큼 반복
i = 1, j = 1 ▶ * i = 2, j = 2 ▶ **
주의할 점 System.out.print("*"); print를 써서 줄바꿈 없이 문자 출력하도록 해준다
[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 만 사용
아래 BufferedReader + StringBuilder 사용
시간차이 두배이상!
백준 10952
A+B - 5
오답 [BufferedReader + StringBuilder]
한 줄에 A 와 B 를 입력하는데 공백까지 포함되어 있어서 오류가 났던것
그리고 주의할 점은 A,B가 0 0일때 출력이 되지 않은채 입력이 종료가 되어야하기 때문에
if 절이 끝나고 sb.append(A+B); 넣어줘야한다
그러므로 break 위에 sb.append가 위치해 있다면 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 처리 방법은?
- Scanner 일때 try-catch 문 혹은 hasNext() 메소드 혹은 hasNextInt() 이용
- BufferedReader 일때 null을 반환한다 그래서 null 인지 아닌지만 조건문을 통해 구분, null 을 반환하기 위해서는 ctrl + Z 혹은 ctrl + D 를 입력하고 EOF를 알린다.
1. [ Scanner 의 while( 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. [BufferedReader]
EOF 상태일경우 null 을 반환하기 때문에
변수 =br.readLine() != null ▶ null이면 a + b 반복, null인 경우 반복문 종료
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 나눈 나머지값과 몫 더하고 % 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);
}
}
while(a!=b);
a 와 새로운 수 b가 같지 않으면 반복문 종료하고 println(cycle) 출력
'공부' 카테고리의 다른 글
메소드 (1) | 2023.06.16 |
---|---|
[백준] 4단계 | 10807, 10871, 10818, 2562, 5597, 3052, 1546 (0) | 2023.03.04 |
[백준] 3단계 | 반복문 1~7 (0) | 2023.02.14 |
[백준] 2단계 | 조건문 1~7 (2) | 2023.01.28 |
[백준] 1단계 | 입출력과 사칙연산 10~14 (0) | 2023.01.26 |