BAEKJOON #1076번 저항 - Java

nathan·2022년 1월 5일
0

알고리즘문제

목록 보기
94/102

저항

출처 : 백준 #1076

시간 제한메모리 제한
2초(추가 시간 없음)128MB

문제

전자 제품에는 저항이 들어간다. 저항은 색 3개를 이용해서 그 저항이 몇 옴인지 나타낸다. 처음 색 2개는 저항의 값이고, 마지막 색은 곱해야 하는 값이다. 저항의 값은 다음 표를 이용해서 구한다.

black01
brown110
red2100
orange31,000
yellow410,000
green5100,000
blue61,000,000
violet710,000,000
grey8100,000,000
white91,000,000,000

예를 들어, 저항의 색이 yellow, violet, red였다면 저항의 값은 4,700이 된다.


입력

첫째 줄에 첫 번째 색, 둘째 줄에 두 번째 색, 셋째 줄에 세 번째 색이 주어진다. 위의 표에 있는 색만 입력으로 주어진다.


출력

입력으로 주어진 저항의 저항값을 계산하여 첫째 줄에 출력한다.


입출력 예시

예제 입력 1

yellow
violet
red

예제 출력 1

4700


예제 입력 2

orange
red
blue

예제 출력 2

32000000


예제 입력 3

white
white
white

예제 출력 3

99000000000


풀이

생각

  • 딱 보자마자 어제 학습했던 HashMap 자료형이 생각났다.
  • HashMap 자료형은 Python의 딕셔너리와 같은 역할을 한다. (key:value 묶음)
  • 이때 value로 값과 곱, 두 개가 있기 때문에 이를 int[] 를 통해 묶어 저장하였다.
  • 다른 사람들 풀이를 보니까 ArrayList에 10개의 단어를 담고 곱은 10^인덱스 값이기 때문에 indexOf로 풀었다. 이처럼 너무 풀이가 보인다고 달려들어서 조금 더 효율적으로 풀 생각을 못했다.
  • 아무래도 오랜만에 알고리즘을 푼 탓일까. 조금 더 침착하게 문제를 보는 연습을 해봐야겠다.

풀이 설명

  • 차례로 3개의 단어를 입력받는다.
  • 미리 저장한 HashMap registerValue에서 처음 두 값은 문자열로 합쳐서 더해준다.
  • 앞에서 합쳐진 문자열을 Long 타입으로 바꾼다.("white"의 경우 곱의 값이 10억에 달하기 때문에 int(약 21억)로는 부족할 것이란 판단)
  • 세 번째 단어에 해당하는 곱을 get()으로 불러와 곱해준 후 반환한다.

java code

// 백준 1076번 저항
package algorithm;

import java.util.*;

public class Baekjoon1076 {
    public static void main(String[] args) {
        HashMap<String, int[]> registerValue = new HashMap<String, int[]>() {{
            put("black", new int[]{0, 1});
            put("brown", new int[]{1, 10});
            put("red", new int[]{2, 100});
            put("orange", new int[]{3, 1000});
            put("yellow", new int[]{4, 10000});
            put("green", new int[]{5, 100000});
            put("blue", new int[]{6, 1000000});
            put("violet", new int[]{7, 10000000});
            put("grey", new int[]{8, 100000000});
            put("white", new int[]{9, 1000000000});
        }};

        Scanner sc = new Scanner(System.in);
        String first, second, third;
        first = sc.nextLine();
        second = sc.nextLine();
        third = sc.nextLine();

        String tempString = "";
        tempString += registerValue.get(first)[0];
        tempString += registerValue.get(second)[0];
        long answer = Long.parseLong(tempString) * registerValue.get(third)[1];

        System.out.println(answer);

    }
}

개선된 java code

// 백준 1076번 개선된 풀이
package algorithm;

import java.util.*;

public class Baekjoon1076U {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String first = sc.nextLine();
        String second = sc.nextLine();
        String third = sc.nextLine();

        ArrayList<String> list = new ArrayList<>();
        list.add("black"); // index = 0
        list.add("brown"); // index = 1
        list.add("red"); // index = 2
        list.add("orange"); // index = 3
        list.add("yellow"); // index = 4
        list.add("green"); // index = 5
        list.add("blue"); // index = 6
        list.add("violet"); // index = 7
        list.add("grey"); // index = 8
        list.add("white"); // index = 9

        long answer = 0L;
        answer += list.indexOf(first)*10;
        answer += list.indexOf(second);
        answer *= Math.pow(10, list.indexOf(third));

        System.out.println(answer);
    }
}
profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글