체육복

이리·6일 전
0

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

문제설명

  • 주어진 파라미터: int n, int[] lost, int[] reserve
  • 반환값: int
  • 체육복 도난 사건 발생!
  • 여벌 체육복이 있는 학생이 체육복을 빌려주려함
  • 학생들 번호는 체격순 → 자신보다 큰 숫자의 학생들에게만 체육복을 빌릴수 있음
  • 체육 수업을 들을 수 있는 학생의 최댓값을 return

풀이방식

  1. 전체 학생수에서 lost 학생들은 참여를 못하게됨
  2. lost 학생은 자신보다 큰 reserve 학생이 있으면 수업을 들을 수 있음
  3. 한번 빌려준 학생은 더이상 빌려줄 수 없음
  4. 전체 학생 수가 적어 반복을 해도 될 것 같음
  5. lost 마다 자신보다 1 작거나 큰 친구들 중 빌릴 수 있는 친구들 찾기

코드

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        boolean[] lostList = new boolean[n+1];
        boolean[] reserveList = new boolean[n+1];
        Arrays.fill(lostList, true);
        Arrays.fill(reserveList, false);
        
        // 참가 못하는 학생 체크
        for(int x: lost){
            lostList[x] = false;
        }
        
        // 빌려줄 수 있는 학생 체크
        for(int y : reserve){
            reserveList[y] = true;
        }
        
        // 참가 X == 빌려줄 수 있을 경우 -> 참가 & 빌려줄수 없다
        for(int i= 1; i <= n; i++){
            if(lostList[i] == false && reserveList[i] == true){
               lostList[i] = true;
               reserveList[i] = false;
            }
        }
        
        // 본인보다 크고 작은 경우 체크 
        for(int i = 1; i <= n; i++){
            if(!lostList[i]){
                // 왼
                if( i - 1 >= 1 && reserveList[i-1]){
                    reserveList[i-1] = false;
                    lostList[i] = true;
                }else if(i + 1 <=n && reserveList[i+1]){
                    // 우
                    reserveList[i+1] = false;
                    lostList[i] = true;
                }
            }
        }
        
        // 답변 작성 
        for(int i = 1; i <= n; i++){
            if(lostList[i]) answer++;
        }
        
        return answer;
    }
}

회고

문제를 제발제발제발 잘읽자..

0개의 댓글

관련 채용 정보