It's going to be one day 🍀

안녕하세요! 매일 매일 공부하려고 노력하는 백엔드 개발자 지망생의 공부 흔적입니다.

코테 준비/백준

[백준] 반복문

2jin2 2024. 1. 24. 17:07

15552. 빠른 A+B

for문 문제를 풀 때 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다.

-> 따라서 Scanner 대신 BufferedReader와 BudderedWriter를 사용할 수 있음

BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

* 버퍼의 단점

- 입력 데이터들이 String으로 반환됨

- 데이터를 재가공 해야함(ex, StringTokenizer을 따로 사용해야함)

- IOExeption의 예외처리가 필요

 

1) BufferedReader import

import java.io.BufferedReader;
import java.io.InputStreamReader;

 

2) BufferedWriter import

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

 

3) 예외 처리

- import

import java.io.IOException;

 

- 적용

public class Main {
	public static void main(String[]args) throws IOException{}
}

-> 추가된 throws IOException은 입출력 동작 시 발생할 수 있는 예외.

- main 메소드에서 throws IOException을 사용하면 이 메소드를 호출하는 부분에서 입출력 예외에 대한 예외 처리를 함.

- 따라서 입출력 관련 문제가 발생할 경우 해당 예외를 적절히 처리하거나 상위 호출자에게 예외 전달.

 

4) bw.write

bw.write(Integer.toString(sum));

-> bw.write는 BufferedWriter을 사용하여 텍스트를 출력하는 메서드 여기엔 '문자열'을 전달해야함.

- 하지만 sum 변수에는 A+B 결과가 저장되어 있고 이 값은 정수형임. 

- 따라서 Integer.toString(sum)은 정수 sum을 문자열로 바꿔주는 메서드임!

 

5) bw.flush

bw.flush();

- BufferedWriter는 버퍼에 데이터를 쌓아두었다가 일정량이 쌓이거나 or 스트림을 닫을 때 한꺼번에 출력함.

- 따라서 출력 늦어짐 방지를 위해 flush로 버퍼에 있는 데이터를 강제로 출력해줌.

- (프로그램이 중간에 에러가 발생하거나 중단되는 경우에도 중요한 데이터를 보존하기 위해 사용)

 

6) 최종 코드

// import java.io.BufferedReader;
// import java.io.InputStreamReader;
// import java.io.BufferedWriter;
// import java.io.OutputStreamWriter;
// import java.io.IOException;
import java.io.*;
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));

        // 테스트케이스의 개수 T를 입력 받습니다.
        int T = Integer.parseInt(br.readLine());

        // 각 테스트케이스를 처리합니다.
        for (int i = 0; i < T; i++) {
            // A와 B를 입력 받습니다.
            StringTokenizer st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());

            // A와 B를 더한 결과를 출력합니다.
            int sum = A + B;
            bw.write(Integer.toString(sum));
            bw.newLine();
        }

        // BufferedWriter를 플러시하고 닫습니다.
        bw.flush();
        bw.close();

        // BufferedReader를 닫습니다.
        br.close();
    }
}

 

+) 모든 import java.io. 들을 import java.io.* 을 사용해 한번에 전부 import할 수 있음!

 

2439. 별 찍기 - 2

for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N-i; j++) {
                bw.write(" ");
            }
            for (int k = 1; k <= i; k++) {
                bw.write("*");
            }
            bw.newLine();
        }

-> 내가 놓친 부분은

1) 무조건 for문 2개로 구현해야한다고 생각해서 3개 아이디어가 떠올랐긴한데도 그냥 2개로 계속 고민함.

2) j for문에서 작동 조건식을 j <= N 으로만 생각했다는 문제. 공백이 i 횟수에 따라 줄어들어야함으로 N-i로 적어줘야함.

3) k for문에서 작동 조건식을 k <= N 으로 생각했다는 문제. 그렇게 하면 

이렇게 별이 줄어들지 않고 계속 똑같게 찍힘. k <= i 으로 해야 i에 따라서 별이 줄어듦.

2, 3) 에서의 놓친 중요한 로직은 i for문 안에서 돌리는 이유는 i랑 연관이 있기 때문이다! for문 작성 시 주의하기

 

10951. A + B - 4 (EOF 사용)

이 문제는 입력에서 더이상의 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하라는 것.

EOF란? : 데이터가 더이상 존재하지 않을 때 EOF(End Of File) 파일의 끝이라고 한다.

 

- Scanner로 EOF 처리하는 법

import java.util.Scanner;
 
public class Main {
	public static void main(String args[]){
		
		Scanner in=new Scanner(System.in);
			
		while(in.hasNextInt()){
		
			int a=in.nextInt();
			int b=in.nextInt();
			System.out.println(a+b);
		
		}	
		in.close();
	}
}

-> while에 hasNextInt() 넣어주면 됨.

hasNextInt()의 경우 입력값이 정수일 경우 ture를 반환하며 정수가 아닐경우 바로 예외를 던짐.

 

- BufferedReader로 EOF 처리하는 법

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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.print(sb);
	}
}

-> readLine() 을 통해 입력받음.

readLine()을 통해 입력을 하여 str에 저장된 데이터가 null일 경우 반목문을 종료시킴. (예외를 던짐)

 

- readLine()은 한 행을 전부 읽기 때문에 공백단위로 입력해 준 문자열을 공백단위로 분리해주어야 함.

-> StringTokenizer 클래스를 이용하여 분리할 것임.

 

- 출력에서는 StringBuilder 를 사용할 것임.

-> StringBuilder 클래스란 String 클래스와 같이 문자열을 다루는 클래스임.

 

처음 알게된 내용이 많았던 백준 반복문 끝 ~

'코테 준비 > 백준' 카테고리의 다른 글

[백준] 정렬  (0) 2024.04.22
[백준] 스택과 큐  (1) 2024.04.18
[백준] 배열  (1) 2024.02.14
[백준] 조건문  (0) 2024.01.22
[백준] 입출력과 사칙연산 중요 내용  (0) 2024.01.18