알고리즘

[백준] 입출력 - 2741, 2742, 2739

hatch 2023. 2. 7. 12:29
728x90
반응형

* 공부 목표

입출력 - 2557, 1000, 2558, 1095010951, 10952, 1095311021, 11022, 11718, 1171911720, 11721, 2741, 2742, 2739, 1924, 8393, 10818, 2438, 2439, 2440, 2441, 2442, 2445, 2522, 2446, 10991, 10992

 

  • 2741번

문) 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

import java.util.*;

public class Main{
    public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		sc.close();
		
		for(int i=1; i<N+1; i++) {
			System.out.println(i);
		}
	}
}

 

  • 2742번

문) 자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

 

** 출력의 순서가 N부터인 내림차순 정렬이다.

 

1) Scanner 활용

import java.util.*;

public class Main{
    public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		sc.close();
		
		while(N>0) {
			System.out.println(N);
			N--;
		}
	}
}

 

2) BufferReader 활용(모범 답안(?)).  // 코드 길이는 조금 더 길었지만, 메모리와 시간 측면에서 훨씬 나았다.

import java.io.*;

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.close();
		
		while(N>0) {
			System.out.println(N);
			N--;
		}
	}
}

 

▶ BufferedReader 썼을 때 훨씬 빠르구나.

▶ BufferedReader + System.out.println() 조합이었는데,

BufferedReader + BufferedWirter() 조합이 가장 빠르고 메모리 소모도 덜 함.

 - 하나하나 print 메소드 출력이 아니라, 한번에 모아서 출력하는 것이기 때문.

 

▶ 그치만, 아직 bufferedReader 사용에 익숙치 않으므로,

선 Scanner 후 BufferedReader 형식의 연습이 필요할 것으로 보임.

 

 

  • 2739번

문) N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

1) Scanner 활용 // 메모리-시간 가장 많이, 가장 오래 잡아먹음.

import java.util.*;

public class Main{
    public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		sc.close();
		for(int i=1; i<10; i++) {
			System.out.println(N + " * " + i + " = " + N*i);
		}
	}
}

 

2) bufferedReader + System.out.println() //메모리는 가장 적게, 시간은 2번째.

import java.io.*;

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.close();
		for(int i=1; i<10; i++) {
			System.out.println(N + " * " + i + " = " + N*i);
		}
	}
}

 

3) bufferedReader + bufferedWriter() //메모리는 2번째, 시간은 가장 빠름.

import java.io.*;

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));
		
		int N = Integer.parseInt(br.readLine());
		br.close();
		for(int i=1; i<10; i++) {
			bw.write(N + " * " + i + " = " + N*i + "\n");
		}
		bw.flush();
		bw.close();
	}
}

 


 

** bufferedReader 사용법

0. 클래스 import와 throws IOException 작성 필수.

 

1. 변수 입력

String 변수 입력 받을 때는 .readLine();

int 변수는? Integer.parseInt(br.readLine());

▶ .read(); 도 있지만 이는 int 값으로 변형하여 읽어오는 방식.

(ex) 1 이라는 수를 int 1로 가져오는 것 아님. 아스키 값의 1 읽어옴(int, 49).

▶ 따라서 형변환 하여 입력 받는 게 낫다.^^

 

2. 엔터 단위(Line 단위)로만 데이터가 쪼개진다.

 - 공백 단위로 가공하려면 추가 작업 필요하다.

 

** bufferedWriter

1. 자동 개행 기능 없다. \n 붙여줘야 한다.

 - .write( +"\n"); // 버퍼 있는 값 전부 출력.

 

2. flush()와 close()를 반드시 호출해야 한다.

 - .flush(); // 남은 데이터 모두 출력.

 - .close(); // 스트림 종료.

 

 

 

[참고] https://st-lab.tistory.com/32