알고리즘/프로그래머스

[프로그래머스] 체육복_JAVA

jimkwon 2022. 2. 28. 13:34
반응형

문제 링크

 

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

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

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

해당 주의사항을 생각하고 로직을 짜면 간단하다. 필자의 로직은 이러하다.

 

1. 전체학생 n만큼의 배열 int student[n] = 1 로, answer = n으로 초기화한다.
2. lost배열을 돌며 체육복을 가져오지 않은 학생은 -1 처리한다.

3. reserve배열을 돌며 여벌을 가져온 경우를 +1로 처리해준다.

4. 전체 student를 돌며 값이 0일 때(체육복을 가져오지 않았을 때) 내 좌우로 값이 2인 경우를 찾는다.(여벌을 가져온 경우)
4-1. 여벌을 가져온 이가 있을 경우, 해당 친구의 값을 -1 해주고 넘어간다.

4-2. 양옆으로 여벌을 가져온 이가 없으면 answer - 1 을 해준다.

 

1~3번 과정에서 student의 체육복 현황을 처리해주고, answer = n으로 초기화해줬다.

모든 학생이 체육복을 가져왔다고 가정한 후, 반복문을 돌며 가져오지 않은 학생의 경우 answer--하도록 처리

 

// 학생수 n만큼 int student[n] = {1}; 선언 answer = n;
// 그중 lost를 돌며 해당 index에 -1 reserver는 +1
// 값이 0일때, 좌우로 값이 2가 없는 경우는 answer-- 빌려준 학생 옷 -1
import java.util.Arrays;
class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n;
        int []student = new int[n];
        
        Arrays.fill(student, 1);
        for (int i : lost)
            student[i - 1] -= 1;
        for (int i : reserve)
            student[i - 1] += 1;
        for (int i = 0; i < student.length; i++) {
            if (student[i] == 0) {
                if (i > 0 && student[i - 1] == 2) //왼쪽 검사
                    student[i - 1] -= 1;
                else if (i < n - 1 && student[i + 1] == 2)
                    student[i + 1] -= 1;
                else
                    answer--;
            }
        }
        return answer;
    }
}

기존에 answer = 0에서 값을 하나씩 올리는 것보다 -1 처리해주는 것이 더 코드면에서 깔끔하게 처리가 되었다.