본문 바로가기

Backend/Algorithm

13. BufferedReader, BufferedWriter, StringTokenizer - 빛 섞어 색 만들기

CodeUp 1084 : [기초-종합] 빛 섞어 색 만들기(설명)

 

 

빨강(red), 초록(green), 파랑(blue) 빛을 섞어
여러 가지 빛의 색을 만들어 내려고 한다.

빨강(r), 초록(g), 파랑(b) 각각의 빛의 개수가 주어질 때,
(빛의 강약에 따라 0 ~ n-1 까지 n가지의 빛 색깔을 만들 수 있다.)

주어진 rgb 빛들을 다르게 섞어 만들 수 있는 모든 경우의 조합(r g b)과
총 가짓 수를 계산해보자.

 

 

 

입력

빨녹파(r, g, b) 각 빛의 강약에 따른 가짓수(0 ~ 128))가 공백을 사이에 두고 입력된다.
예를 들어, 3 3 3 은 각 색깔 빛에 대해서 그 강약에 따라 0~2까지 3가지의 색이 있음을 의미한다.

출력

만들 수 있는 rgb 색의 정보를 오름차순(계단을 올라가는 순, 12345... abcde..., 가나다라마...)으로
줄을 바꿔 모두 출력하고, 마지막에 그 개수를 출력한다.


입력 예시  

2 2 2

 

 

출력 예시

0 0 0

0 0 1

0 1 0

0 1 1

1 0 0

1 0 1

1 1 0

1 1 1

8

 

 

 

첫번째 코드: 시간초과 

 

 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		int cnt = 0;
		int r, g, b;
		Scanner sc = new Scanner(System.in);
		r = sc.nextInt();
		g = sc.nextInt();
		b = sc.nextInt();
		sc.close();
		
		for(int i=0; i<r; i++) 
			for(int j=0; j<g; j++) 
				for(int k=0; k<b; k++) {
					System.out.printf("%d %d %d\n", i, j, k);
					cnt++;
				}	
		System.out.println(cnt);

	}	
}

 

 

문제는 Scanner.

bufferedReader/ bufferedWriter를 사용하면 많은 양의 데이터를 한꺼번에 담아 처리하기 때문에 스캐너보다 빠르게 처리할 수 있다.

하지만 IOException 예외처리가 필수. 

정리가 너무 잘 되어있어서 그대로 가져왔음. 

jhnyang.tistory.com/92

 

[Java 자바 입출력] BufferedReader/BufferedWriter

[자바 입출력 함수] BufferedReader / BufferWriter BufferedReader/BufferedWriter은 이름처럼 버퍼를 이용해서 읽고 쓰는 함수입니다. 이 함수는 버퍼를 이용하기 때문에 이 함수를 이용하면 입출력의 효율이..

jhnyang.tistory.com

 

두번째 코드: 통과

 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		int cnt = 0;
		int r, g, b;
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		r = Integer.parseInt(st.nextToken()); 
		g = Integer.parseInt(st.nextToken());
		b = Integer.parseInt(st.nextToken());
		String s ="";
		
		for(int i=0; i<r; i++) {
			for(int j=0; j<g; j++) {
				for(int k=0; k<b; k++) {
					s = i + " " + j + " " + k + "\n";
					bw.write(s);
					cnt++;
				}
			}
		}
		bw.write(Integer.toString(cnt)); //여기서 toString 처리를 해주지않으면 출력되지 않는다.
		bw.close();
	}	
}