문제#
- 링크로 대체
풀이 및 주저리..
SSAFY에서 자바 오프라인 수업 두번째날 시간이 끝나고 남는 시간에 풀어본 문제이다. SW Expert Academy의 난이도중 D3에 해당하는 문제로 후에 SW 역량테스트 A형을 통과하려면 D5정도는 풀 수 있어야한다고 하는데.. D3에서 좀 시간이 걸렸던 문제이다. 첫번째로 고민했던 것은 시간복잡도를 계산하면서 이게 통과가 가능한가?를 생각하는게 좀 어려웠다. 여기 문제들 특징이 좀 문제들이 장황하고 문제를 해석하는데 시간이 상당히 오래걸린다. 아무튼 문제를 이해하는데 시간이 좀 걸렸고 접근방식을 어떻게 세울까 고민을 했다. 일단 제약조건으로 중복되는 수가 없었고 조금만 생각을 해보니 10자리(1~9)까지만 가능하고 11자리 수 부터는 무조건 정답이 될 수 없다는 것을 생각하여 처리를 해주어 풀어주게 되었다.
풀이로 가장 중요한 것은 코드상의 while문 안의 어마어마한 조건식.. 이였던 것 같다. 전체 크기의 안쪽이면서 방향에 따라 처리를 해주기 위해서 조건식이 길어지게 되었고 한쪽방향의 끝까지 가줘야하다보니 좀 지저분해지는 느낌이 있었다. 네방향 처리를 해주는것도 조금 맘에 걸렸지만.. 더 좋은 코드가 생각나질 않아서.. 더 좋은 코드가 생각난다면? 돌아올수도 있다.
코드
package ssafy.swexpert.d3;
import java.util.Scanner;
public class Problem9839 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int iT = sc.nextInt();
for (int i = 1; i <= iT; i++) {
int N = sc.nextInt();
int[] numArr = new int[N];
for (int j = 0; j < N; j++) {
numArr[j] = sc.nextInt();
}
int answer = getBestCouple(numArr);
System.out.println("#" + i + " " + answer);
}
}
public static int getBestCouple(int[] arr) {
int answer = -1;
for (int i = 0; i < arr.length - 1; i++) {
int x = arr[i];
for (int j = i + 1; j < arr.length; j++) {
int y = arr[j];
int xy = x * y;
boolean isOk = true;
if (xy < 10 && answer < xy) {
answer = xy;
}
char[] numCharArr = String.valueOf(xy).toCharArray();
if (numCharArr.length > 10)
continue;
for (int k = 0; k < numCharArr.length - 1; k++) {
if (numCharArr[k + 1] - numCharArr[k] != 1) {
isOk = false;
break;
}
}
if (isOk && answer < xy)
answer = xy;
}
}
return answer;
}
}
기억에 남길 것!
- 예외가 될 수 있는 부분은 빼고 시작하면 쉬워진다.