알고리즘/프로그래머스
[프로그래머스] 체육복_JAVA
jimkwon
2022. 2. 28. 13:34
반응형
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42862
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
해당 주의사항을 생각하고 로직을 짜면 간단하다. 필자의 로직은 이러하다.
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 처리해주는 것이 더 코드면에서 깔끔하게 처리가 되었다.