💡 핵심 요약 (TL;DR)
'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가지의 색이 있음을 의미한다.
출력예시 만들 수 있는 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); } }
시간초과를 해결하기 위해서는 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(); } } }
배운지식 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 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();
다른 문제 풀이가 보고싶다면?
#Codeup100