Q 1864 문어 숫자

💡 문제 요약 및 분석

아래 규칙에 따라 8진법의 문어 숫자가 주어지면 그것을 10진법으로 변환하여 출력하는 문제.

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

💡 알고리즘 설계

  1. 저장 공간 (배열, StringBuilder)

    • 문어 숫자를 저장할 공간 필요. 9개 배열에 문어 숫자 9개를 순서대로 넣는다. 해당하는 문자의 인덱스가 인간 숫자가 된다.
    • 출력값을 저장할 StringBuilder 공간 필요.
  2. 입력 (반복문)

    • while (true) 로 입력을 받고 ‘#’ 입력받으면 break; 한다.
  3. 연산 (반복문)

    • 반복문 사용하여 문자열을 char 로 분리하여 숫자로 변환한다. (정적 메서드 사용)
    • 반복문 안에서 해당 인덱스만큼 8을 거듭제곱한다. (Math.pow 사용)
    • 계산한 값을 StringBuilder 에 저장한다.
  4. 출력

    • StringBuilder 에 저장된 값을 한 번에 출력한다.

💡 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static int converter(char[] octoNum, char c) {
        if (c == '/') {
            return -1;
        }

        int result = 0;
        for (int i = 0; i < octoNum.length; i++) {
            if (octoNum[i] == c) {
                result = i;
            }
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        char[] octoNum = {'-', '\\', '(', '@', '?', '>', '&', '%'};

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

            int result = 0;
            for (int i = 0; i < n.length(); i++) {
                char c = n.charAt(i);
                int humanNum = converter(octoNum, c);
                int power = n.length() - 1 - i;
                result += humanNum * Math.pow(8, power);
            }
            sb.append(result).append("\n");
        }
        System.out.println(sb);
    }

}

💡 틀린 부분 수정

💡 시간 복잡도, 공간 복잡도

시간 복잡도공간 복잡도
O(n^2)O(n^2)

💡 다른 풀이

나는 배열에 문어 숫자를 저장해서 풀었지만 아래와 같이 조건문으로만 풀이해도 된다. 역시 배열을 사용하지 않는 쪽이 시간 복잡도가 줄어드는 것 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

        while (true) {
            String n = br.readLine();
            int result = 0;
            if (n.equals("#")) break;

            for (int i = 0; i < n.length(); i++) {
                if (n.charAt(i) == '-') {
                    result += 0 * Math.pow(8, (n.length() - 1 - i));
                } else if (n.charAt(i) == '\\') {
                    result += 1 * Math.pow(8, (n.length() - 1 - i));
                } else if (n.charAt(i) == '(') {
                    result += 2 * Math.pow(8, (n.length() - 1 - i));
                } else if (n.charAt(i) == '@') {
                    result += 3 * Math.pow(8, (n.length() - 1 - i));
                } else if (n.charAt(i) == '?') {
                    result += 4 * Math.pow(8, (n.length() - 1 - i));
                } else if (n.charAt(i) == '>') {
                    result += 5 * Math.pow(8, (n.length() - 1 - i));
                } else if (n.charAt(i) == '&') {
                    result += 6 * Math.pow(8, (n.length() - 1 - i));
                } else if (n.charAt(i) == '%') {
                    result += 7 * Math.pow(8, (n.length() - 1 - i));
                } else {
                    result += -1 * Math.pow(8, (n.length() - 1 - i));
                }
            }
            sb.append(result).append("\n");
        }
        System.out.println(sb);
    }
}
시간 복잡도공간 복잡도
O(n^2)O(n)