728x90
반응형
문제 설명
1. 전체 학생의 수, 체육복을 도난당한 학생 위치, 여벌 체육복을 가진 학생 위치가 주어진다.
2. 여벌 체육복을 가진 K번째 학생은 자기 앞, 뒤의 학생 즉 K-1, K+1번 학생 둘 중 한명에게만 체육복을 빌려줄 수 있다.
3. 최대한 많은 학생이 체육을 들을 수 있게 여벌 체육복을 가진 학생이 빌려주어야 한다.
풀이 과정
1. 학생의 수가 주어지면 체육복을 빌려야 하는 학생은 -1, 빌려준 수 있는 학생은 1로 세팅해 준다. 나머지는 0이다.
2. 전체 학생을 돌아가면서 옷을 잃어버린 경우 빌리도록 한다.
3. 처음부터 끝까지 진행하기 떄문에 자기 뒤의 학생에게 쭉 옷을 빌리게 되면 최대값을 가질 수 있다.
4. 그런데 자기 뒤의 학생은 체육복이 없고, 앞의 학생에게 있는 경우가 있을 수 있으므로, 앞이 해당하지 않는 경우 이 process를 진행하면 된다.
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
반응형
'알고리즘 공부' 카테고리의 다른 글
[백준 1062번] 가르침 - java (0) | 2021.05.09 |
---|---|
[프로그래머스] 프린터 - java (0) | 2021.05.02 |
[프로그래머스] 모의고사 - java (0) | 2021.05.02 |
[백준 1987번] 알파벳 - java (0) | 2021.05.02 |
[백준 2607번] 비슷한 단어 - java (2) | 2021.05.01 |