[Programmers / Level1] 42862. 체육복(Java)

이하얀·2024년 6월 11일
0

💡 Info




입출력 조건




입출력 예시





문제 이해


  • 체육복을 도난당하는 경우를 반영하여, 체육 수업을 들을 수 있는(체육복이 있는) 학생 수 운트하기


알고리즘


풀이 시간 : 30분

  1. lost, reserve 배열 정렬
  2. 전체 학생 n - lost -> 체육복(여벌 X)을 가진 학생 수 도출
  3. lost && reserve (lost==reserve)-> 체육복 O, 빌려줄 수 X
    • answer 증가
  4. 그게 아닐 경우 -> 체육복을 앞과 뒤 번호 학생에게 빌려줄 수 O
    • lost[i] - 1과 현재 학생이 같거나, lost[i] + 1과 현재 학생이 같은 경우
import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        //다른 학생에게 체육복을 빌려줄 수 없는 경우 -> 여벌 체육복 O, 도난 O
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[i]){
                    answer++;
                    break;
                }
            }
        }
        
        //도난 O -> 체육복을 빌릴 수 있는 학생 수
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]){
                    answer++;
                    break;
                }
            }
        }
        
        // finalAnswer = n - lost.length + answer;
        
        return answer;
    }
}


오답체크


  • 도난당하지 않는 학생 수를 answer로 지정하지 않았던 것이 원인.
  • 체육복을 가질 수 있는 학생 수를 뜻하는 두개의 for문에서 lost와 reserve의 초기화가 진행되지 않음.
  • 또한, 첫번째 반복문에서 lost[i]와 reserve[i]를 비교해 생긴 문제 -> lost[i]와 reserve[j]를 비교해야 함!
//before
//다른 학생에게 체육복을 빌려줄 수 없는 경우 -> 여벌 체육복 O, 도난 O
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[i]){
                    answer++;
                    break;
                }
            }
        }
        
        //도난 O -> 체육복을 빌릴 수 있는 학생 수
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]){
                    answer++;
                    break;
                }
            }
        }
//after
...
int answer = n - lost.length;

...
//다른 학생에게 체육복을 빌려줄 수 없는 경우 -> 여벌 체육복 O, 도난 O
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]){
                    answer++;
                    lost[i] = -1;
                    reserve[j] = -1;
                    break;
                }
            }
        }
        
        //도난 O -> 체육복을 빌릴 수 있는 학생 수
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]){
                    answer++;
                    //lost[i] = -1;
                    reserve[j] = -1;
                    break;
                }
            }
        }


최종 풀이


풀이 시간 : 50분(첫 풀이 시간 포함)

  1. lost, reserve 배열 정렬
  2. 전체 학생 n - lost -> 체육복(여벌 X)을 가진 학생 수 도출
  3. lost && reserve (lost==reserve)-> 체육복 O, 빌려줄 수 X
    • answer 증가
  4. 그게 아닐 경우 -> 체육복을 앞과 뒤 번호 학생에게 빌려줄 수 O
    • lost[i] - 1과 현재 학생이 같거나, lost[i] + 1과 현재 학생이 같은 경우
import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        
        int answer = n - lost.length;
        
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        
        //다른 학생에게 체육복을 빌려줄 수 없는 경우 -> 여벌 체육복 O, 도난 O
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] == reserve[j]){
                    answer++;
                    lost[i] = -1;
                    reserve[j] = -1;
                    break;
                }
            }
        }
        
        //도난 O -> 체육복을 빌릴 수 있는 학생 수
        for(int i=0; i<lost.length; i++){
            for(int j=0; j<reserve.length; j++){
                if(lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]){
                    answer++;
                    //lost[i] = -1;
                    reserve[j] = -1;
                    break;
                }
            }
        }
        
        return answer;
    }
}


결과


profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE 개발 기록 노트☘️

0개의 댓글