BaekJoon1076 - 저항

[Java] BaekJoon1076 - 저항

BaekJoon1076

BaekJoon1076-2

  • Scanner와 배열을 이용하여 처음 풀었을 당시의 코드:

    import java.util.Scanner;
      
    public class Main {
      public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
      
        String[] input = new String[3];
        int[] inputNum = new int[3];
      
        String[] color = {"black", "brown", "red", "orange", "yellow", "green", "blue",
            "violet", "grey", "white"};
        int[] value = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
      
        for (int i = 0; i < input.length; i++){
          input[i] = scanner.nextLine();
          for(int j =0; j < color.length; j++) {
            if (input[i].equalsIgnoreCase(color[j])){
              inputNum[i] = j;
            }
          }
        }
          
        long tmp = (inputNum[0]*10)+ inputNum[1];
        long answer = tmp * value[inputNum[2]];
      
        System.out.println(answer);
      
        scanner.close();
      }
    }
      
    
    • color의 값과 color에 부합하는 곱의 값을 배열 안에 넣어 관리를 하도록 제작하였다. 3개의 값을 입력 받아야 하므로, 첫 반복문은 하나의 color 이름을 입력받아, 그 이름에 맞는 값이 color 배열 내의 몇 번 째인지 확인하여, 이 index값을 int형식의 배열에 집어넣었다.

      if (input[i].equalsIgnoreCase(color[j])){
                inputNum[i] = j;
              }
      
    • 첫 번째 색상은 color의 값을 10의 자리로, 두 번째 색상은 color의 값을 1의 자리로 얻어 서로 더하는 것을 위의 표에서 확인하였기 때문에, 값이 커질 것을 대비하여 long 타입의 변수를 선언하여 집어넣었다.

      long tmp = (inputNum[0]*10)+ inputNum[1];
      
    • 이후, 세 번째 색상의 경우 color의 곱을 첫번째와 두번째 색상의 합에 곱해야 하기 때문에, color의 곱을 집어넣은 배열을 호출해, 인덱스부분에는 Index의 값을 넣어둔 int 배열을 집어넣어 해결하였다.

      long answer = tmp * value[inputNum[2]];
      
      • 결과:

    Scanner_배열

    ​ 별로 효율적이지도 않고, 코드 자체가 깔끔하지 않은 것 같아 아래와 같이 수정하였다.

  • BufferedReader와 enum을 조합하여 변경 한 코드:

    import java.io.*;
      
    enum Colors {
      black(0, 1),
      brown(1, 10),
      red(2, 100),
      orange(3, 1000),
      yellow(4, 10000),
      green(5, 100000),
      blue(6, 1000000),
      violet(7, 10000000),
      grey(8, 100000000),
      white(9, 1000000000);
      
      int value;
      int multiply;
      
      Colors(int value, int multiply) {
        this.value = value;
        this.multiply = multiply;
      }
      
      public int getValue() {
        return value;
      }
      
      public int getMultiply() {
        return multiply;
      }
    }
      
    public class Main {
      
      
      public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      
        String a = br.readLine();
        String b = br.readLine();
        String c = br.readLine();
          
        System.out.println(result(a,b,c));
      
        br.close();
      }
      
      public static long result(String input1, String input2, String input3) {
        Colors colors = Colors.valueOf(Colors.class, input1);
      
        long answer = colors.getValue() * 10;
        answer += Colors.valueOf(Colors.class, input2).getValue();
        answer *= Colors.valueOf(Colors.class, input3).getMultiply();
      
        return answer;
      }
    }
      
    
    • enum의 컬러에 value와 multiply의 값을 입력하여, color의 이름만 안다면 valued의 값과 multiply값을 얻을 수 있도록 제작하였다.

      black(0, 1)
      
    • enum의 경우, 클래스 메서드인 values()를 사용 할 수 있는데, 이는 지정된 열거형에서 입력한 이름과 일치하는 열거형 상수를 반환한다. 따라서 imput1이 orange인 경우:

       Colors colors = Colors.valueOf(Colors.class, input1);
       > Colors.valueOf(Colors.class, "orange");
      	// Colors.class 안에서 "orange"라는 열거형 상수를 찾는다.
          
      long answer = colors.getValue();
      // colors의 값은 "orange"를 가리키고 있으므로, orange의 value 3을 answer에 저장한다. 
      

      Colors.class 는, 클래스 객체를 의미하는 리터럴이다. 열거형 클래스인 Colors 의 자료들을 담고있는 Class인스턴스의 참조변수와 같다.

      • 결과: BufferedReader_enum

      이전보다 더 나아진 결과를 확인 할 수 있다.