-
고민
문제 제한 사항을 보고 처음에는 1~32001 길이의 배열을 만들어 해당 값을 넣고 계산하며 처리하려했다. 테스트 케이스가 대부분 통과 못하자, 해당 범위를 벗어난 값이 다른 연산자에 의해 다시 결과값에 포함될 수 있는 사실을 깨닫고 List에 값을 관리하는 형식으로 생각을 변경했다. N의 리스트를 구할 때, 우선 5를 N만큼 이은 수가 (1 ~ N -1) 리스트에 없는 경우 N번째 리스트에 추가해주고 앞 전에 구한 리스트들로 값을 구하려 했다. 예를 들어 N = 6일 경우 N = 5인 리스트에 5와 덧셈, 곱셈, 뺄셈, 나눗셈을 하면되겠지 싶었다. 결과는 예외가 많았다. N = 2 인 리스트를 3번 계산한 결과를 생각지 못했다. 여기까지 생각 후 정답이 나왔다. 리스트의 길이가 N인경우 ( {1,N-1}, {2, N-2}, {3,N-3}, … {N-1, 1}) 의 리스트끼리의 계산 결과를 전부 포함하면 예외가 없다고 생각했다. 여기에 더해서 계산하는 범위는 절반까지만 진행하면되기에 N/2까지 계산하였다.
-
import java.util.ArrayList; import java.util.HashSet; import java.util.List; class Solution { public List<Integer>[] getNewList(List<Integer> list[], int N, int level){ int tmp = 0; for( int i = level; i > 0 ; i-- ) { tmp += N * Math.pow(10, (i-1)); } list[level].add(tmp); for(int i = 1; i <= level/2; i++) { int j = (level - i); for(int left = 0; left < list[i].size(); left++) { for(int right = 0; right < list[j].size(); right++) { int l = list[i].get(left); int r = list[j].get(right); list[level].add(l + r); list[level].add(l * r); list[level].add(l - r); list[level].add(r - l); if ( r != 0 ) { list[level].add(l / r); } if ( l != 0 ) { list[level].add(r / l); } } } } return list; } public int solution(int N, int number) { List<Integer> list[] = new ArrayList[9]; for(int i = 0 ; i < 9; i++) { list[i] = new ArrayList<Integer>(); } for(int level = 1; level < 9; level++) { list = getNewList(list, N, level); HashSet<Integer> tmp = new HashSet<Integer>(list[level]); list[level] = new ArrayList<Integer>(tmp); if( list[level].contains(number)) { return level; } } return -1; } }