-
백준 1076번 저항알고리즘 문제풀이/Java 2020. 4. 5. 16:16
문제
전자 제품에는 저항이 들어간다. 저항은 색 3개를 이용해서 그 저항이 몇 옴인지 나타낸다.
처음 색 2개는 저항의 값이고, 마지막 색은 곱해야 하는 값이다.
저항의 값은 다음 표를 이용해서 구한다.
색 값 곱
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 예를 들어, 저항에 색이 yellow, violet, red였다면 저항의 값은 4,700이 된다.
입력
첫째 줄에 첫 번째 색, 둘째 줄에 두 번째 색, 셋째 줄에 세 번째 색이 주어진다. 색은 모두 위의 표에 쓰여 있는 색만 주어진다.
출력
입력으로 주어진 저항의 저항값을 계산하여 첫째 줄에 출력한다.
예제 입력 1 복사
yellow violet red
예제 출력 1 복사
4700
해설
이 문제의 경우, 처음에는 열거형 클래스인 enum을 활용해 풀고 싶었다. 허나, 자바스크립트와 달리 문자열을 입력받아서 클래스명과 비교하는 방법이 모호하다고 느껴졌다. 구체적으로 어떻게 해야할 지 감이 오질 않았다. 그래서 할 수 없이 세 개의 배열을 만들고 인덱스 값을 찾아서 계산하는 방식으로 문제를 해결하였다.
import java.io.*; import java.util.*; public class Stream { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(System.out)); String[] colors = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "grey", "white"}; int[] values = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int[] multiplies = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}; long result = 0; for (int i = 0; i < 3; i++) { int index = java.util.Arrays.asList(colors).indexOf(br.readLine()); // 이 부분이 중요 if(i != 2) { result = result * 10 * i + values[index]; } else { if(index != 0) result = result * multiplies[index]; } } wr.write(String.valueOf(result)); wr.flush(); } }
자바는 배열에서 indexOf 메소드를 제공하지 않는다. 그렇기 때문에 따로 List를 만들어 활용하는 방법이 필요하다.
(위 코드에서 "// 이 부분이 중요" 부분을 보면 된다.)
다만 저렇게 Arrays.asList를 사용하기 위해선 인자로 제공되는 데이터의 타입이 primitive가 아닌 Object 타입이어야 한다. (문제를 풀 때는 몰랐었다. 운 좋게도 String 타입이라 문제를 해결했다.) 즉 int형 배열에서 인덱스를 찾기 위해선 Integer[]로 선언해야 한다.
아래는 스택오버플로 사이트에 나온 대답이다.
https://stackoverflow.com/questions/4962361/where-is-javas-array-indexof
다른 사람의 풀이를 보니 enum 클래스로 충분히 해결이 가능했다. enum 클래스 메서드 중 하나인 values()를 활용하면 enum 클래스의 인스턴스 배열을 얻을 수 있다. 뿐만 아니라. name() 메서드를 활용하면 해당 인스턴스 참조변수의 이름도 얻을 수 있다. 다음은 이를 활용한 풀이이다.
import java.io.*; import java.util.*; 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); public int value; public int multiply; Colors(int value, int mulitply){ this.value = value; this.multiply = mulitply; } public static Colors find(String s){ for(Colors color : values()){ if(color.name().equals(s)) return color; } return null; } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(System.out)); long result; result = Colors.find(br.readLine()).value * 10; result += Colors.find(br.readLine()).value; result *= Colors.find(br.readLine()).multiply; System.out.println(result); } }
확실히 훨씬 깔끔한 느낌이다. enum을 활용하여, 색깔과 값, 곱의 관계를 지어줄 수 있다는 게 매력적이다.
values 메서드는 상속 받은 메서드인지는 모르겠지만, API Document에는 나오지 않는다. 그러니 꼭 알아두도록 하자.
public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(System.out)); long result; Colors c = Colors.valueOf(Colors.class, br.readLine()); result = c.value * 10; result += Colors.find(br.readLine()).value; result *= Colors.find(br.readLine()).multiply; System.out.println(result); } }
추가적으로 공부하다가 알게된 사실은 위의 내가 정의한 find 메서드처럼 굳이 하나하나 문자열과 비교하여 enum 클래스 인스턴스를 찾을 필요가 없었다는 것이다.
valueOf 메서드를 사용하면 되는데, 첫 번째 인자로, 열거형 클래스의 정보를 전달받고, 두 번째 인자로 문자열을 전달받는다.
열거형 클래스의 정보가 무엇이냐를 설명하기엔 상당히 복잡해서 책의 설명을 담도록 하겠다.
.class는 Class라는 이름의 클래스 인스턴스이다.
API 문서를 참조하면 Class라는 이름의 클래스가 있음을 확인할 수 있는데, 이 클래스는 자료형 정보를 표현하기 위한 클래스이다. 즉 Colors.class는 열거형 클래스인 Colors의 자료형 정보를 담고 있는 Class 인스턴스의 참조변수로 이해할 수 있다.느낀 점
- enum 클래스의 사용방법에 대해 알 수 있었고, 배열에서 indexOf를 어떻게 구현하는 지 알 수 있었다. (사실 for문을 돌려 equals를 통해 해결이 가능한 문제긴 하다.)
- enum 클래스 메서드인 values()와 name()은 꼭 알아두도록 하자.
'알고리즘 문제풀이 > Java' 카테고리의 다른 글
백준 1010번 다리 놓기 (0) 2020.04.06 백준 1152번 단어의 개수 (0) 2020.04.05 백준 1233번 주사위 (0) 2020.04.05 [프로그래머스 Level 1] 문자열 내 마음대로 정렬하기 (0) 2020.04.03 [프로그래머스 Level 1] 실패율 (0) 2020.04.03