suheang

[백준] | JAVA, 자바 | 1864번 - 문어 숫자 본문

알고리즘

[백준] | JAVA, 자바 | 1864번 - 문어 숫자

suheang 2024. 4. 14. 21:58

https://www.acmicpc.net/problem/1864

 

1864번: 문어 숫자

해류가 매우 느리고 바닥을 기어다니는 생물이 적은 바다 밑바닥에서만 발견되는 잔물결 무늬의 정체는 오랫동안 해양학자들에게 수수께끼였다. 하지만 최근의 연구 성과는 동물 언어학 분야

www.acmicpc.net


문제 요약 :

 위에 사는 이들에게는 문어가 쓰는 숫자와 그를 표현하는 잔물결 무늬가 매우 낯설 수밖에 없다. 따라서 연구자들은 다음과 같은 기호로 잔물결 무늬를 적기로 합의했다. 각 기호와 대응하는 숫자는 다음과 같다.

  • -는 0에 대응한다.
  • \는 1에 대응한다.
  • (는 2에 대응한다.
  • @는 3에 대응한다.
  • ?는 4에 대응한다.
  • >는 5에 대응한다.
  • &는 6에 대응한다.
  • %는 7에 대응한다.
  • /는 -1에 대응한다.

해양 신경학자들은 특히 음수를 나타내는 기호가 있다는 사실에 흥분하면서, 아직 걸음마 단계인 두족류 신경학이 이 발견을 계기로 크게 발전하기를 기대하고 있다.

당연히 문어의 수 체계는 8진법에 기반한다. 예를 들면 다음과 같다.

(@&는 2 × 82 + 3 × 8 + 6 = 158이다.

?/--는 4 × 83 + −1 × 82 + 0 × 8 + 0 = 1984이다.
/(\는 −1 × 82 + 2 × 8 + 1 = −47이다.

당신에게 주어진 문제는 문어 숫자를 입력 받아 십진수로 나타내는 것이다.

 

( 입력 받은 문어 숫자에 대응하는 십진수를 한 줄에 하나씩 출력 )


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        Map<String, Integer> octopus = new HashMap<>();
        octopus.put("-", 0);
        octopus.put("\\", 1);
        octopus.put("(", 2);
        octopus.put("@", 3);
        octopus.put("?", 4);
        octopus.put(">", 5);
        octopus.put("&", 6);
        octopus.put("%", 7);
        octopus.put("/", -1);

        while (true) {
            String number = br.readLine();
            if (number.equals("#")) break;

            int total = 0;
            for (int i = 0; i < number.length(); i++) {
                String s = String.valueOf(number.charAt(i));
                int octal = (int) Math.pow(8,number.length() - 1 - i);
                if (octal == 0) octal = 1;
                total += octopus.get(s) * octal;
            }
            System.out.println(total);
        }
    }
}

 

1. HashMap을 사용해 각 기호와 대응하는 숫자를 입력

2. while문을 통해 문어의 수 입력받기

3. 입력받은 문어의 수가 "#" 이라면 while문 종료

4. 10진수로 변환한 수를 저장할 변수 total 생성

5. 입력받은 문어의 수를 한 글자씩 가져와서 s에 저장

6. 8진법을 10진수로 전환할 수 있게 변수 octal에 값 저장

7. s와 octal를 곱하고 total에 합 계산

8. 계산된 total 출력