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에 값을 넣는 것은 단순히 put
메소드를 사용하여 키와 값을 맵에 추가하는 것으로 해결가능 하다. 그런 다음 정렬된 엔트리들을 얻기 위해
temp.entrySet().stream().sorted(Map.Entry.comparingByValue())
사용하여 맵의 엔트리들을 값으로 정렬하는 스트림을 생성한다.
이 스트림은 forEach
를 사용하여 순회할 수 있으며, 각 엔트리의 키를 answer
배열에 저장할 수 있다.
Map.Entry.comparingByValue()
메소드를 사용하여 맵의 엔트리들을 값에 따라 정렬할 수 있다. 이 메소드는 Comparator를 반환하며, 이 Comparator는 sorted
메소드에 전달하여 엔트리들을 값에 따라 정렬할 수 있다.
temp.entrySet().stream().sorted(Map.Entry.comparingByValue())
람다 표현식 내에서 사용되는 지역 변수는 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]++;
}
);