백준에서만 알고리즘 문제를 풀다가 처음으로 코드트리에서 문제를 풀어보았다.
브론즈1 난이도의 문제인 거 같았다.
알고리즘 분류는 완전탐색이다.
package CodeTree;
import java.io.*;
import java.util.*;
/**
* 이상한 진수
* a를 한 숫자만 바꾼 모든 경우의 수를 저장한다.
* b도 마찬가지로 모두 저장한다.
* a와 b를 각각 대조하면서 맞는 숫자를 찾는다.
* <p>
* 문자열로 저장한다.
*/
public class sol1 {
static String a;
static String b;
static Long result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
a = br.readLine();
b = br.readLine();
Set<Long> possibleBinaryNum = possibleBinarySet(a);
Set<Long> possibleTernaryNum = possibleTernarySet(b);
for (Long num : possibleBinaryNum) {
if (possibleTernaryNum.contains(num)) {
result = num;
break;
}
}
System.out.println(result);
}
public static Set<Long> possibleBinarySet(String binary) {
Set<Long> possibleNums = new HashSet<>();
for (int i = 0; i < binary.length(); i++) {
char[] chars = binary.toCharArray();
chars[i] = (chars[i] == '0') ? '1' : '0';
possibleNums.add(Long.parseLong(new String(chars), 2));
}
return possibleNums;
}
public static Set<Long> possibleTernarySet(String ternary) {
Set<Long> possibleNums = new HashSet<>();
for (int i = 0; i < ternary.length(); i++) {
char[] chars = ternary.toCharArray();
char originChar = chars[i];
for (char c = '0'; c <= '2'; c++) {
if (c != originChar) {
chars[i] = c;
possibleNums.add(Long.parseLong(new String(chars), 3));
}
}
}
return possibleNums;
}
}
Set인터페이스와 HashSet 구현체를 사용해보았다.
그리고 parseLong 메서드를 사용해서 문자열로 나타낸 이진수나 삼진수를 쉽게 Long 타입으로 변환할 수 있다는 것을 알게 되었다.
중복되지 않는 요소들의 모음을 나타내는 자료구조
- 중복을 허용하지 않는다.
- HashSet: 순서가 존재하지 않는다. 내부적으로 해시테이블을 사용하여 빠른 접근 속도를 보장한다.
- LinkedHashSet: 요소가 추가되는 순서를 보장한다.
- TreeSet: 요소들이 자동으로 정렬된 상태로 저장된다.