알고리즘 공부

[프로그래머스] 체육복 - java

철매존 2021. 5. 2. 17:48
728x90
반응형

문제 설명

1. 전체 학생의 수, 체육복을 도난당한 학생 위치, 여벌 체육복을 가진 학생 위치가 주어진다.

2. 여벌 체육복을 가진 K번째 학생은 자기 앞, 뒤의 학생 즉 K-1, K+1번 학생 둘 중 한명에게만 체육복을 빌려줄 수 있다.

3. 최대한 많은 학생이 체육을 들을 수 있게 여벌 체육복을 가진 학생이 빌려주어야 한다.

 

 

풀이 과정

 1. 학생의 수가 주어지면 체육복을 빌려야 하는 학생은 -1, 빌려준 수 있는 학생은 1로 세팅해 준다. 나머지는 0이다.

 2. 전체 학생을 돌아가면서 옷을 잃어버린 경우 빌리도록 한다.

 3. 처음부터 끝까지 진행하기 떄문에 자기 뒤의 학생에게 쭉 옷을 빌리게 되면 최대값을 가질 수 있다.

 4. 그런데 자기 뒤의 학생은 체육복이 없고, 앞의 학생에게 있는 경우가 있을 수 있으므로, 앞이 해당하지 않는 경우 이 process를 진행하면 된다.

 

코드

class Solution
{
public int solution(int n, int[] lost, int[] reserve)
{
int[] cloths = new int[n];
int answer = 0;
// 학생의 시작은 1, 배열의 시작은 0이다.
// 여벌의 옷을 cloths의 위치에 더해준다.
for (int i : reserve)
cloths[i - 1]++;
// 도둑맞은 옷을 cloths에서 빼준다.
for (int i : lost)
cloths[i - 1]--;
for (int i = 0; i < cloths.length; i++)
{
// 옷을 잃어버린 경우 진행시킨다.
if (cloths[i] < 0)
{
// 0~마지막 전까지 학생의 경우 다음 학생이 여벌의 옷을 가진 경우 뒷 학생의 옷을 가져와서 해당 학생이 갖게 된다.
if (i != cloths.length - 1 && cloths[i + 1] > 0)
{
cloths[i]++;
cloths[i + 1]--;
}
// 1~마지막까지 학생의 경우 이전 학생이 옷을 가진 경우 앞 학생의 옷을 가져와서 해당 학생이 갖게 된다.
else if (i != 0 && cloths[i - 1] > 0)
{
cloths[i]++;
cloths[i - 1]--;
}
// 이렇게 진행한 이유는 앞 뒤로 학생들이 존재하는데 두 경우를 모두 조건으로 만들어 구하는 것 보다 해당 방식이 효율적이기 때문이다.
}
}
// 전체 학생을 조사하여 옷을 가지고 있는 경우 체육수업을 들을 수 있다.
for (int i = 0; i < cloths.length; i++)
if (cloths[i] >= 0)
answer++;
return answer;
}
}
view raw 체육복 hosted with ❤ by GitHub
반응형