Java Coding Test ( 사다리 타기 )

song yuheon·2023년 9월 20일
0

Java Algorithm

목록 보기
9/18
post-thumbnail

문제


n ladder answer
5 [[1, 3], [2, 4], [1, 4]]['D', 'B', 'A', 'C', 'E']
7 [[1, 3, 5], [1, 3, 6], [2, 4]]['A', 'C', 'B', 'F', 'D', 'G', 'E']


설계



코드 구현


import java.util.*;
class Sol1 {
    public char[] solution(int n, int[][] ladder){
        char[] answer = new char[n];
//        Map<Character,Integer> temp = new HashMap<>();
//        for(int i = 0;i<n;i++)
//            temp.put((char)(i+65),i+1);
////        System.out.println("-----------------");
////        temp.forEach((k,v)->System.out.println("key : "+k+" value : "+v));
////        System.out.println("-----------------");
//
//        for (int i = 0; i < ladder.length; i++) {
//            for (int j = 0; j < n; j++) {
//                for (int k = 0; k < ladder[i].length; k++) {
//                    if(ladder[i][k]==temp.get((char)(j+65)))
//                        temp.put((char)(j+65),temp.get((char)(j+65))+1);
//                    else if(ladder[i][k]+1==temp.get((char)(j+65)))
//                        temp.put((char)(j+65),temp.get((char)(j+65))-1);
//                }
//
//            }
//        }
//        int[] i = {0};
////        temp.forEach((k,v)->System.out.println("key : "+k+" value : "+v));
//        temp.entrySet().stream().sorted(Map.Entry.comparingByValue())
//                .forEach((k)-> {
//                            answer[i[0]] = k.getKey();
//                            i[0]++;
//                        }
//                );

        /**
         * 기존 풀이는 너무 시간이 걸리고 비효율적인 부분이 많다.
         * 단순하게 문자를 swap하는 방식으로 풀어보자
         */

        for (int i = 0; i < answer.length; i++)
            answer[i] = (char)(i+65);


        for (int[] ints : ladder)
            for (int j:ints){
                char temp = answer[j-1];
                answer[j-1] = answer[j];
                answer[j] = temp;
            }

        return answer;

        /**
         * 트러블 슈팅
         * Map에 넣는데 까지는 성공 근데 어떻게 정렬해서 로드하지?
         * 값을 기준으로 어떻게 정렬할까?
         * int i는 왜 람다 표현식 안에서 사용불가능하지?
         */
    }

    public static void main(String[] args){
        Sol1 T = new Sol1();
        System.out.println(Arrays.toString(T.solution(5, new int[][]{{1, 3}, {2, 4}, {1, 4}})));
        System.out.println(Arrays.toString(T.solution(7, new int[][]{{1, 3, 5}, {1, 3, 6}, {2, 4}})));
        System.out.println(Arrays.toString(T.solution(8, new int[][]{{1, 5}, {2, 4, 7}, {1, 5, 7}, {2, 5, 7}})));
        System.out.println(Arrays.toString(T.solution(12, new int[][]{{1, 5, 8, 10}, {2, 4, 7}, {1, 5, 7, 9, 11}, {2, 5, 7, 10}, {3, 6, 8, 11}})));
    }
}

트러블 슈팅


Map에 넣는데 까지는 성공 근데 어떻게 정렬해서 로드하지?

Map에 값을 넣는 것은 단순히 put 메소드를 사용하여 키와 값을 맵에 추가하는 것으로 해결가능 하다. 그런 다음 정렬된 엔트리들을 얻기 위해

temp.entrySet().stream().sorted(Map.Entry.comparingByValue())

사용하여 맵의 엔트리들을 값으로 정렬하는 스트림을 생성한다.

이 스트림은 forEach를 사용하여 순회할 수 있으며, 각 엔트리의 키를 answer 배열에 저장할 수 있다.

값을 기준으로 어떻게 정렬할까?

Map.Entry.comparingByValue() 메소드를 사용하여 맵의 엔트리들을 값에 따라 정렬할 수 있다. 이 메소드는 Comparator를 반환하며, 이 Comparator는 sorted 메소드에 전달하여 엔트리들을 값에 따라 정렬할 수 있다.

temp.entrySet().stream().sorted(Map.Entry.comparingByValue())

int i는 왜 람다 표현식 안에서 사용불가능하지?

람다 표현식 내에서 사용되는 지역 변수는 final 또는 effectively final이어야 한다. 즉, 람다 표현식 내에서 변경할 수 없습니다. 그러나 배열의 요소는 변경할 수 있으므로 int[] i = {0};와 같은 방식으로 이 문제를 우회하면 된다. 람다 표현식 내부에서 배열 i의 요소를 변경하여 answer 배열의 인덱스로 사용할 수 있다.

int[] i = {0};
temp.entrySet().stream().sorted(Map.Entry.comparingByValue())
        .forEach((k)-> {
                    answer[i[0]] = k.getKey();
                    i[0]++;
                }
        );

profile
backend_Devloper

0개의 댓글