문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/131130
제한 사항
입출력 예
풀이
import java.util.HashSet;
import java.util.ArrayList;
class Solution {
public int solution(int[] cards) {
ArrayList<HashSet<Integer>> indexGroupList = new ArrayList<>();
HashSet<Integer> checkSet = new HashSet<>();
for (int i = 0; i < cards.length; i++) {
if (checkSet.contains(i)) continue;
HashSet<Integer> indexGroupSet = new HashSet<>();
int index = i;
while (!indexGroupSet.contains(index)) {
indexGroupSet.add(index);
checkSet.add(index);
index = cards[index] - 1;
}
indexGroupList.add(indexGroupSet);
}
if (indexGroupList.size() == 1) return 0;
else return indexGroupList.stream()
.map(s -> s.size())
.filter(i -> i != 1)
.sorted((i, j) -> j - i)
.limit(2)
.reduce(1, (i, j) -> i * j);
}
}
후기
문제가 조금 길긴 하지만 문제에서 원하는 것은 단순하다. 특정 인덱스의 카드에 접근하고 해당 카드의 내용을 인덱스로 바꿔서 다시 그 인덱스의 카드로 이동하고 이걸 반복해서 루프가 만들어지면 중단하고 그룹으로 만든다. 이렇게 만든 그룹 중에 길이가 긴 두 그룹의 길이를 곱해서 반환하면 된다. 나는 모든 그룹의 길이를 곱하는 줄 알고 다 곱했다가 틀려서 문제를 다시 보니 두 그룹만 곱해서 반환하는 거여서 고치니까 바로 통과했다... 이 문제는 다행히 카드의 길이가 100밖에 안 돼서 문제없지만 효율성 테스트가 있었다면 다른 방식을 고민해봐야 한다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
[프로그래머스][Java][Lv. 2] 테이블 해시 함수 (0) | 2024.08.14 |
---|---|
[프로그래머스][Java][Lv. 2] 전력망을 둘로 나누기 (0) | 2024.08.13 |
[프로그래머스][Java][Lv. 2] 숫자 카드 나누기 (0) | 2024.08.10 |
[프로그래머스][Java][Lv. 2] 디펜스 게임 (0) | 2024.08.08 |
[프로그래머스][Java][Lv. 2] 마법의 엘리베이터 (0) | 2024.08.07 |