백준 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) 출력

 

 

 

반응형
LIST

+ Recent posts