문제 설명
문제 풀이
- 생소한 진법 문제였다. 알고리즘에 try, catch는 처음 쓰는듯..
- 우선 2~9진법의 타당성 여부를 저장하기 위한 배열을 둔다.
- 각 표현식에 대해서 아래와 같이 validation을 진행한다.
- 각 숫자가 n진법 -> 10진법 변환이 불가능하다면 bools[n] = false로 바꿔줌
- 변환된 10진법 수의 연산 결과가 틀리다면 bools[n] = false로 바꿔줌
- 주의할 점은 'X'가 포함된 표현식도 변환을 통한 validation을 해줘야 한다는 점.
- 이후 valid한 진법들의 연산 결과가 모두 같다면 해당 수를 넣고 다르다면 '?'로 치환해서 결과 배열에 넣어줌
소스 코드 (JAVA)
import java.util.*;
class Solution {
boolean[] bools = new boolean[10];
void validate(String expr) {
StringTokenizer st = new StringTokenizer(expr);
String A = st.nextToken();
String command = st.nextToken();
String B = st.nextToken();
st.nextToken();
String C = st.nextToken();
for (int i = 2; i <= 9; i++) {
int convA = 0, convB = 0, convC = 0;
try {
convA = Integer.parseInt(A, i);
convB = Integer.parseInt(B, i);
if (!"X".equals(C)) convC = Integer.parseInt(C, i);
} catch (NumberFormatException e) {
bools[i] = false;
continue;
}
if ("X".equals(C)) continue;
if ("+".equals(command)) {
if (convA + convB != convC)
bools[i] = false;
} else {
if (convA - convB != convC)
bools[i] = false;
}
}
}
String convert(String expr) {
if (expr.charAt(expr.length() - 1) != 'X') return null;
StringTokenizer st = new StringTokenizer(expr);
String A = st.nextToken();
String command = st.nextToken();
String B = st.nextToken();
st.nextToken();
st.nextToken();
String res = "";
for (int i = 2; i <= 9; i++) {
if ("?".equals(res)) break;
if (!bools[i]) continue;
int convA = 0, convB = 0;
try {
convA = Integer.parseInt(A, i);
convB = Integer.parseInt(B, i);
} catch (NumberFormatException e) {
continue;
}
if ("+".equals(command)) {
String convC = Integer.toString(convA + convB, i);
if ("".equals(res)) res = convC;
else if (!res.equals(convC)) res = "?";
} else {
String convC = Integer.toString(convA - convB, i);
if ("".equals(res)) res = convC;
else if (!res.equals(convC)) res = "?";
}
}
return A + " " + command + " " + B + " = " + res;
}
public String[] solution(String[] expressions) {
ArrayList<String> result = new ArrayList<>();
Arrays.fill(bools, true);
int ind = 0;
for (String str : expressions) {
validate(str);
}
for (String str : expressions) {
String res = convert(str);
if (res != null) result.add(res);
}
return result.toArray(new String[0]);
}
}