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

문제 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가지의 색이 있음을 의미한다.
1
2 2 2
  • 출력예시
    만들 수 있는 rgb 색의 정보를 오름차순(계단을 올라가는 순, 12345… abcde…, 가나다라마…)으로 줄을 바꿔 모두 출력하고, 마지막에 그 개수를 출력한다.
1
2
3
4
5
6
7
8
9
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




내코드

출력값은 완벽하나 시간초과 결과가 나타났다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package codeUp100;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] color = sc.nextLine().split(" ");
sc.close();

int rPick = Integer.parseInt(color[0]);
int gPick = Integer.parseInt(color[1]);
int bPick = Integer.parseInt(color[2]);

int count = 0;
for(int r=0; r<rPick; r++){
for(int g=0; g<gPick; g++){
for(int b=0; b<bPick; b++){
System.out.printf("%d %d %d\n", r,g,b);
count ++;
}
}
}
System.out.println(count);
}//end of main()
}

시간초과를 해결하기 위해서는 BufferReader 와 BufferWriter 클래스를 사용하여 입력, 출력받아야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String[] n = br.readLine().split(" ");
int count = 0;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 0; i < Integer.valueOf(n[0]); i++) {
for (int j = 0; j < Integer.valueOf(n[1]); j++) {
for (int k = 0; k < Integer.valueOf(n[2]); k++) {
bw.write(i + " " + j + " " + k + "\n");
count++;
}
}
}
bw.write(String.valueOf(count));
bw.flush();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}//end of main()
}




배운지식

BufferReader 와 BufferWriter 클래스를 사용하여 입력, 출력받으면 시간초과 해결할 수 있다.
System.out.println();이 굉장히 느리다는 것을 알게되었다.




추가 코드

내 멘토님이 내 코드를 보시고 코드리뷰를 해주셨다.
코드리뷰까지 받다니 난 참 럭키다.
코드리뷰를 받으니까 재미있다! 항상 내 코드가 최선이 아니라는 생각에 더 나은 코드를 배우고싶었기때문이다.
이 재미가 바로 성장하는 즐거움일까? 행-복!
이번에 멘토님이 알려주신건 빅오표기법이었다. 신기했지만 동시에 어려웠다. 수련이 더 필요하다…
멘토님이 중첩for문을 보곤 단일 for문을 알려주셨다.
사실 나도 단일 for문쓰고싶었는데 내 마음을 어떻게 아셨지?ㅋㅋㅋㅋㅋㅋ
천재인듯.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//단일for문
Scanner sc = new Scanner(System.in);
String color[] = sc.nextLine().split(" ");
int r = Integer.parseInt(color[0], 10);
int g = Integer.parseInt(color[1], 10);
int b = Integer.parseInt(color[2], 10);

int loop = r * g * b;
int rLoop = g * b;
int gLoop = b;

try(BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))){
for(int i=0; i<loop; i++){
int colorR = i / rLoop;
int colorG = (i%rLoop) / gLoop;
int colorB = i % b;

bw.write(colorR +" " + colorG + " " + colorB+"\n");
}
bw.write(loop+"");
bw.flush();
}catch(IOException ie){
ie.printStackTrace();




다른 문제 풀이가 보고싶다면?