프로그래머스

99클럽 코테 스터디 1일차 TIL + 프로그래머스 체육복(자바)

리콜 2024. 3. 30. 01:30

https://school.programmers.co.kr/learn/courses/30/lessons/42862#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

먼저 문제를 보면 중요하다고 생각한 요소는

체육수업을 들을 수 있는 학생의 최댓값을 return

바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다

 

이에 lost를 기준으로 reserve에 앞뒤 번호가 있는지 찾거나 

reserve를 기준으로 앞뒤로 lost에 번호가 있는지 찾을 수 있다고 생각했고

lost를 기준으로 하기로 생각하였다.

 

또한 count라는 변수를 만들어 체육복을 입을 수 있게 된 학생을 관리해

전체학생수에서 도난당한 학생 수를 빼고 count를 더해 학생수를 구하겠다고 생각하였다.

 

1.첫번째 코드

class Solution {
   //체육수업을 들을 수 있는 학생의 최댓값을 return
    //바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
    public int solution(int n, int[] lost, int[] reserve) {
        //lost의 앞뒤로 reserve를 찾기
        //or
        //reserve 앞뒤로 lost찾기

        int count = 0;

        for(int i = 0; i<lost.length; i++){
            for(int k =0; k< reserve.length; k++){
                if(lost[i] - 1 == reserve[k]){
                    count++;
                    reserve[k] = 0;
                    break;
                }
                if(lost[i] +1 == reserve[k]){
                    count++;
                    reserve[k] = 0;
                    break;
                }
            }
        }

        int answer = n - lost.length + count;
        return answer;
    }
}

 

그러나 많은 부분에서 오류가 났고 다시 문제를 읽으며

 

여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.  이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

 

를 보게 되엇다.

이 제한 사항 이전의 제한 사항이 너무 뻔한거라 마지막 제한사항을 읽지 않았다.;

제한사항을 꼼꼼히 읽어야 한다고 느끼게 되었다.

 

2번째 코드

class Solution {
   //체육수업을 들을 수 있는 학생의 최댓값을 return
    //바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
    public int solution(int n, int[] lost, int[] reserve) {
        //lost의 앞뒤로 reserve를 찾기
        //or
        //reserve 앞뒤로 lost찾기

        int count = 0;

        //여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
        // 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
        // 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

        // 5 [2,4] [2,3,5]

        for(int i = 0; i<lost.length; i++){
            for(int k =0; k< reserve.length; k++){
                if(lost[i] == reserve[k]){ //여벌있는데 도난당한 학생
                    count++; 
                    lost[i] = -1;
                    reserve[k] = -1; // [2,4] [2,3,5] -> [-1,4] [-1, 3, 5]
                    break;
                }
            }
        }

        for(int i = 0; i<lost.length; i++){
            for(int k =0; k< reserve.length; k++){
                if(lost[i] - 1 == reserve[k]){
                    count++;
                    reserve[k] = -1;
                    break;
                }
                if(lost[i] +1 == reserve[k]){
                    count++;
                    reserve[k] = -1;
                    break;
                }
            }
        }

        int answer = n - lost.length + count;
        return answer;
    }
}

 

 

다 통과하는데 2개의 경우만 통과 하지않았다.

여기서부터 난관이었는데

 

고칠만한게 배열을 정렬하는것밖에 없어 보여 이건가? 하며 정렬을 넣어주었다.

import java.util.ArrayList;
import java.util.Collections;

class Solution {
 //체육수업을 들을 수 있는 학생의 최댓값을 return
    //바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
    public int solution(int n, int[] lost, int[] reserve) {
        //lost의 앞뒤로 reserve를 찾기
        //or
        //reserve 앞뒤로 lost찾기
        ArrayList<Integer> lostList = new ArrayList<>();
        ArrayList<Integer> reserveList = new ArrayList<>();
        for(int i:lost){
            lostList.add(i);
        }
        for(int i:reserve){
            reserveList.add(i);
        }

        Collections.sort(lostList);
        Collections.sort(reserveList);


        int count = 0;

        //여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
        // 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
        // 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

        // 5 [2,4] [2,3,5]

        for(int i = 0; i<lostList.size(); i++){
            if(reserveList.contains(lostList.get(i))){
                reserveList.remove(lostList.get(i));
                lostList.remove(i);  // 5 [2,4] [2,3,5] -> [4] [3,5]
            }
        }

        for(int i = 0; i< lostList.size(); i++){
            for(int k =0; k< reserveList.size(); k++){
                if(lostList.get(i) - 1 == reserveList.get(k) || lostList.get(i) + 1 == reserveList.get(k)){
                    reserveList.remove(k);
                    count++;
                    break;
                }
            }
        }

        int answer = n - lostList.size() + count;
        return answer;
    }
}

 

 

 

그러니 이전의 두개가 해결되었지만 뭔가 다른게 오류가 났다.;

로직을 검사하면서 여벌을 가져왔지만 도난 당한 경우의 학생을 처리하는데 remove를 사용하면서

인덱스가 당겨지며 오류가 발생한다는 것을 알게 되어 수정하게 되었습니다.

 

 

import java.util.ArrayList;
import java.util.Collections;

class Solution {
 //체육수업을 들을 수 있는 학생의 최댓값을 return
    //바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
    public int solution(int n, int[] lost, int[] reserve) {
        //lost의 앞뒤로 reserve를 찾기
        //or
        //reserve 앞뒤로 lost찾기
        ArrayList<Integer> lostList = new ArrayList<>();
        ArrayList<Integer> reserveList = new ArrayList<>();
        for(int i:lost){
            lostList.add(i);
        }
        for(int i:reserve){
            reserveList.add(i);
        }

        Collections.sort(lostList);
        Collections.sort(reserveList);


        int count = 0;

        //여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
        // 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
        // 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

        // 5 [2,4] [2,3,5]

         for(int i = 0; i<lostList.size();){
            if(reserveList.contains(lostList.get(i))){
                reserveList.remove(lostList.get(i));
                lostList.remove(i);  // 5 [2,4] [2,3,5] -> [4] [3,5]
            }
            else{
                i++;
            }
        }

        for(int i = 0; i< lostList.size(); i++){
            for(int k =0; k< reserveList.size(); k++){
                if(lostList.get(i) - 1 == reserveList.get(k) || lostList.get(i) + 1 == reserveList.get(k)){
                    reserveList.remove(k);
                    count++;
                    break;
                }
            }
        }

        int answer = n - lostList.size() + count;
        return answer;
    }
}

 

 

문제를 꼼꼼히 읽어봐야 한다!를 뼈져리게 느꼈고 자바를 많이 잊어 기본기가 많이 떨어졌다는 것이 느껴졌다.

반응형