Q 1864 문어 숫자
💡 문제 요약 및 분석
아래 규칙에 따라 8진법의 문어 숫자가 주어지면 그것을 10진법으로 변환하여 출력하는 문제.
- -는 0에 대응한다.
- \는 1에 대응한다.
- (는 2에 대응한다.
- @는 3에 대응한다.
- ?는 4에 대응한다.
- >는 5에 대응한다.
- &는 6에 대응한다.
- %는 7에 대응한다.
- /는 -1에 대응한다.
💡 알고리즘 설계
저장 공간 (배열, StringBuilder)
- 문어 숫자를 저장할 공간 필요. 9개 배열에 문어 숫자 9개를 순서대로 넣는다. 해당하는 문자의 인덱스가 인간 숫자가 된다.
- 출력값을 저장할 StringBuilder 공간 필요.
입력 (반복문)
- while (true) 로 입력을 받고 ‘#’ 입력받으면 break; 한다.
연산 (반복문)
- 반복문 사용하여 문자열을 char 로 분리하여 숫자로 변환한다. (정적 메서드 사용)
- 반복문 안에서 해당 인덱스만큼 8을 거듭제곱한다. (Math.pow 사용)
- 계산한 값을 StringBuilder 에 저장한다.
출력
- 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) |