알고리즘 스터디 7월 4주차 문제2 (최고의 쌍)

문제#

  • 링크로 대체

풀이 및 주저리..

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;

    }

}

기억에 남길 것!

  • 예외가 될 수 있는 부분은 빼고 시작하면 쉬워진다.
© 2020 JunhoBaik, Built with Gatsby