프로그래머스 그리디 - 체육복 [JAVA] - 22년 7월 20일

Denia·2022년 7월 20일
0

코딩테스트 준비

목록 보기
11/201
package com.company;

import java.util.Arrays;

class Solution {
    static public void main(String[] args) {
        System.out.println(solution(5, new int[]{2, 4}, new int[]{1, 3, 5}) == 5);
        System.out.println(solution(5, new int[]{2, 4}, new int[]{3}) == 4);
        System.out.println(solution(3, new int[]{3}, new int[]{1}) == 2);
        System.out.println(solution(2, new int[]{1,2}, new int[]{1,2}) == 2);
        System.out.println(solution(3, new int[]{2}, new int[]{2,3}) == 3);
        System.out.println(solution(5, new int[]{2,4}, new int[]{3,1}) == 5);
    }

    static public int solution(int n, int[] lostArr, int[] reserveArr) {
        int answer = 0;
        //n - lost수 를 먼저 구하고 거기에 reserve 에서 체육복을 빌려줄 친구를 찾아서 더해주자.
        answer = n - lostArr.length;

        //reserve중에 lost가 있는지 확인하기.
        //확인하고 reserve를 새로 보관할 Arr 를 만들기
        int[] newReserveArr = new int[reserveArr.length];

        //정렬을 시키지 않으면 마지막 테스트 케이스에서 실패한다.
        //solution(5, new int[]{2,4}, new int[]{3,1}) == 5;
        Arrays.sort(lostArr);
        Arrays.sort(reserveArr);

        //for문을 돌면서 reserve를 확인하기
        for (int i = 0; i < reserveArr.length; i++) {
            boolean isContain = false;
            int tempJ = -1;
            for (int j = 0; j < lostArr.length; j++) {
                if(reserveArr[i] == lostArr[j]){
                    isContain = true;
                    tempJ = j;
                    break;
                }
            }
            if(isContain){
                newReserveArr[i] = -1; //newReserve에 -1을 넣어서 사용하지 못하는 값이라고 표시
                lostArr[tempJ] = -1; //Lost 값을 변경시켜서 lost를 없애자
                answer += 1; //Lost 와 reserve가 중복되면 lost를 하나 없애는것과 동일하므로 answer에 1개를 추가
            }else {
                newReserveArr[i] = reserveArr[i]; //lost에 없으면 해당 reserve는 살아있는 reserve니까 newReserveArr 에 추가
            }
        }

        //for문을 돌면서 체육복을 빌릴 수 있는지 확인하기
        for (int i = 0; i < lostArr.length; i++) {
            for (int j = 0; j < newReserveArr.length; j++) {
                //-1이 들어있으면 사용하지 못하는 값이므로 조건으로 걸었다.
                if ((lostArr[i] - 1 == newReserveArr[j] || lostArr[i] + 1 == newReserveArr[j]) && newReserveArr[j] > 0) {
                    answer += 1;
                    //체육복을 빌렸으면 빌린 친구는 체육복이 없으므로 없다고 표시하자.
                    newReserveArr[j] = -1;
                    break;
                }
            }
        }

        return answer;
    }
}

다른 사람 풀이를 보던 와중에 Hash를 사용해서 푼게 보였는데 좋은 풀이 같아서 가져왔습니다.

import java.util.HashSet;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer=n-lost.length;
        HashSet<Integer> ko = new HashSet<Integer>();
        for(int k : reserve) {
            ko.add(k);
        }
        for(int i =0;i<lost.length;i++) {
            if(ko.contains(lost[i])) {
                //System.out.println("내껀내가입지");
                answer++;
                ko.remove(lost[i]);
                lost[i]=-1;
            }
        }


        for(int i =0;i<lost.length;i++) {
            //System.out.println(i);

            if(ko.contains(lost[i]-1)) {
                //System.out.println("있다");
                answer++;
                ko.remove(lost[i]-1);
            }else if(ko.contains(lost[i]+1)) {
                //System.out.println("있다");
                answer++;
                ko.remove(lost[i]+1);
            }
            //System.out.println("없다");
        }


        return answer;
    }
}
profile
HW -> FW -> Web

0개의 댓글