99클럽 코테 스터디 16일차 TIL + Array

Boxx-Ham·2024년 6월 4일
0

99TIL

목록 보기
8/19
post-thumbnail

1. 오늘의 문제

체육복

2. 문제 분석

  • 전체 학생의 수 : n
  • 체육복 도난당한 학생들의 번호가 담긴 배열 : lost
  • 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve
  • return 값 : 체육 수업을 들을 수 있는 학생의 최댓값
  • n : 2명 이상, 30명 이하
  • 체육복을 도난당한 학생 수 : 1명 이상, n명 이하 (중복 X)
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복 빌려줄 수 있음
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있음. 이 때 이 학생은 체육복을 하나만 도난당했다고 가정, 남은 체육복이 하나이기에 다른 학생에게는 체육복 빌려 줄 수 없음

nlostreservereturn
5[2, 4][1, 3, 5]5
5[2, 4][3]4
3[3][1]2

3. 문제 풀이

  1. 전체 학생 배열을 만듬 ⇾ 초기화값 안정해주면 0으로 초기화 됨
  2. lost 배열의 학생들의 값을 -1 함
  3. reserve 배열의 학생들의 값을 +1 함
  4. 전체 학생 배열을 돌면서 값이 -1인 학생이 있으면 그 학생의 앞, 뒤 학생이 1인지 확인하고 빌려줌 ⇾ -1인 학생은 0으로, 1인 학생은 0으로 만듬
  5. 수업 들을 수 있는 학생의 수를 카운트하기 위해 0인 학생이 있으면 count 변수에 +1 함

4. 구현 코드

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        // 전체 학생 배열 : 초기값 0
        int[] students = new int[n];
        
        // 체육복 도난 당한 학생은 -1함
        for (int l : lost){
            students[l-1]--;   // 배열의 인덱스 0부터 시작하니깐 인덱스에 -1 해줌
        }
        
        // 여벌의 체육복 가져온 학생들 +1 함
        for (int r : reserve) {
            students[r-1]++;
        }
        
        // 전체 학생 배열 쭉 돌면서 도난 당한 학생 찾음(-1)
        for (int i = 0; i < n; i++) {
            if (students[i] == -1) {
            	// 앞의 학생에게 빌리기
            	// 인덱스 범위를 넘으면 안되니 인덱스 범위 먼저 체크
                if ( i-1 >= 0 && students[i-1] == 1){
                    students[i]++;
                    students[i-1]--;
                  // 뒤의 학생에게 빌리기
                } else if (i+1 < n && students[i+1] == 1) {
                    students[i]++;
                    students[i+1]--;
                }
            }
        }
        
        // 체육 수업 들을 수 있는 학생 수 체크
        int count = 0;
        for (int student : students) {
            if (student >= 0) {
                count++;
            }
        }
        return count;
    }
}

5. 오늘의 회고

  • 확실히 어려웠음 무슨 자료 구조를 이용할지 헤매는데 시간을 많이 잡아먹음
  • 그래도 예시를 잘 풀어보면서 하다보니 감이 좀 잡히는 듯 함
  • 처음에 할 때는 index 범위를 벗어나는지 확인하는 것을 뒤로 했는데 오류 때문에 뭐가 문제인가 했음 했음. 그래서 그냥 index 범위 체크를 && 앞으로 옮겨 했더니 오류가 사라짐.
    • 그 이유는 && 뒤에 하면 이미 범위를 벗어나는 연산을 해버리기 때문. 그래서 먼저 범위 체크 먼저 해야 함

#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL

0개의 댓글