본문 바로가기

알고리즘/Programmers

[Programmers] Level1. 체육복 (Java)

Level1. 체육복

문제설명 )

풀이Code )

더보기
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        int cnt = 0;

        for (int i=0; i<lost.length; i++) {
            for (int j=0; j<reserve.length; j++) {
                if (lost[i] == reserve[j]) { // 여분의 체육복이 있지만 잃어버린 학생 제외하기
                    cnt++; // 체육복이 있는것이므로 cnt ++
                    lost[i] = -1; // 잃어버린 학생에서 제외
                    reserve[j] = -1; // 비려주는 학생에서 제외
                    break;
                }
            }
        }

        for (int i=0; i<lost.length; i++) { // 잃어버린 학생에게 빌려줄수있는 학생 여부 확인 
            for (int j=0; j<reserve.length; j++) {
                if (lost[i] == reserve[j] +1 || lost[i] == reserve[j] -1) {
                    cnt++; // 빌려줄수있는 학생있으면 cnt에 ++
                    reserve[j] = -1; // 빌려주고나면 빌려준 학생은 -1값으로 변경
                    break;
                }
            }
        }

        answer = n - lost.length + cnt; // 총 학생수 - 잃어버린 학생 + cnt

        return answer;
    }
}

풀이법 )

  1. 여분의 체육복이있지만 잃어버린 학생 먼저 제외시키기
  2. 잃어버린 학생에게 체육복 빌려줄수있는 학생있는지 cnt 
  3. 총학생수 에서 잃어버린 학생을 제외시키고 cnt를 더해주기

2021.11.14 풀이

더보기
import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        int lostCnt = 0;
        Arrays.sort(lost); // lost가 정렬안되서 들어올시 순서대로 제거를 못하니까 정렬해주기
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int num : reserve) {
            list.add(num);
        }
        
        for(int i=0; i<lost.length; i++) {
            // 잃어버렸는데 여유분 갖고있는 학생을 우선 제거해준다.
            if(list.contains(lost[i])) {
                list.remove(Integer.valueOf(lost[i]));
                lost[i] = 0;
            }
        }
        
        for(int i=0; i<lost.length; i++) {
            // 위에서 제거한 학생빼고 나머지 학생들중에서 찾는다
            if(lost[i] != 0) {
                if(list.contains(lost[i]-1)) { // 학생의 전번호가 여유분이 있는지 체크
                    list.remove(Integer.valueOf(lost[i]-1));
                } else if (list.contains(lost[i]+1)) { // 학생의 뒷번호가 여유분이 있는지 체크
                    list.remove(Integer.valueOf(lost[i]+1));
                } else {
                    lostCnt++; // 두가지 경우가 모두없으면 잃어버린 학생수 +
                }
            }
        }
        
        return n - lostCnt;
    }
}

기존코드가 시간복잡도는 훨씬 빠른데.. 실패케이스가 나온다.