-
백준 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 메서드를 사용하면 되는데, 첫 번째 인자로, 열거형 클래스의 정보를 전달받고, 두 번째 인자로 문자열을 전달받는다.
static <T extends Enum<T>>
TvalueOf(Class<T> enumType, String name) Returns the enum constant of the specified enum type with the specified name.
열거형 클래스의 정보가 무엇이냐를 설명하기엔 상당히 복잡해서 책의 설명을 담도록 하겠다.
.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