프로그래머스 lv1 체육복

namkun·2022년 7월 3일
0

코딩테스트

목록 보기
10/79

문제 링크

체육복

풀이

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class Solution {
    public static int solution(int n, int[] lost, int[] reserve) {
        List<Integer> lostList = Arrays.stream(lost).sorted().boxed().collect(Collectors.toList());
        List<Integer> reserveList = Arrays.stream(reserve).sorted().boxed().collect(Collectors.toList());
        
        // 체육복을 이미 빌려준 사람들을 확인하기 위해서 다음과 같은 리스트 생성
        List<Integer> lenderList = new ArrayList<>();

		// 모든 반 인원 - 체육복을 잃어버린 사람의 수
        int cnt = n - lost.length;

        // 체육복 여분이 있는 사람이 체육복을 훔침당하는 경우의 수에 대한 체크
        for (int j : lost)
            if (reserveList.contains(j)) {
                lostList.remove((Integer) j);
                reserveList.remove((Integer) j);
                lenderList.add(j);
                cnt++;
            }

		// 체육복을 빌려줄 수 있는 상황의 수 비교
        for (int i : lostList) {
            if (reserveList.contains(i - 1) && !lenderList.contains(i - 1)) {
                    lenderList.add(i - 1);
                    cnt++;
            } else if (reserveList.contains(i + 1) && !lenderList.contains(i + 1)) {
                    lenderList.add(i + 1);
                    cnt++;
            }
        }

        return cnt;
    }
}

소감

  • 이정도면 Stream 를 무지성으로 쓰고 있는게 아닌가 싶은데..
  • greedy 알고리즘 문제라고 한다.. 사실 모르고 그냥 풀었다.
  • 그런데 문제 풀면서 조건을 제대로 읽는 습관을 들여야겠다. 체육복을 훔침 당한 사람이 체육복 여분이 있는 사람이 될 수 있다는 조건을 확인하지 못하고 풀어서 시간을 한참 써먹었다.
  • 체육복을 빌려준 사람들을 확인하기 위해서 새로운 list를 생성했는데, 이 방법 말고도 체육복을 빌려준 사람인 경우 해당 인덱스의 값을 변경하는 방법이 있었다... 역시 멍청하면 모두가 고생한다.
profile
개발하는 중국학과 사람

0개의 댓글