[백준] 3단계 | 반복문

백준 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)이 인쇄됩니다.