문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
1. 학생의 대여 상태(있음, 없음, 대여 가능)를 저장할 수 있는 상수와 배열(arr)을 만든다.
2. 빌려줄 수 있는 학생을 체크한다.
3. 빌려줄 수 있는 학생 + 도난 =>가지고 있는 상태, 여분이 없는데 + 도난 => 도난 상태로 저장한다.
4. 학생의 번호를 순회하면서, 앞부터 도난당한 학생이 있으면 준다.
앞 학생의 입장에서는 현재 학생이 주지 않으면, 체육복을 받을 수 없어서, 앞 학생에게 체육복을 부여하는 것이 체육복을 부여할 수 있는 최댓값이 된다.
소스코드
import java.util.Arrays;
class Solution {
private static final int isLost = 0;
private static final int isExists = -1;
private static final int isReverse = 1;
public int solution(int n, int[] lost, int[] reserve) {
int[] arr = new int[n + 1];
Arrays.fill(arr, isExists);
//빌려줄 수 있는 처리
for (int num : reserve) {
arr[num] = isReverse;
}
for (int num : lost) {
//여분이 있었던 사람
if (arr[num] == isReverse) {
arr[num] = isExists;
//여분이 없는 사람(체육복이 없음)
} else {
arr[num] = isLost;
}
}
for(int i = 1; i < n; i++) {
// System.out.print(i + " ");
// System.out.println(Arrays.toString(arr));
if (arr[i] == isReverse) {
int front = i - 1;
if (arr[front] == isLost) {
arr[front] = isExists;
arr[i] = isExists;
continue;
}
int back = i + 1;
if (arr[back] == isLost) {
arr[back] = isExists;
arr[i] = isExists;
}
}
}
if (arr[n] == isReverse) {
if (arr[n - 1] == isLost) {
arr[n - 1] = isExists;
arr[n] = isExists;
}
}
int answer = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] != isLost) answer++;
}
return answer;
}
}'Problem Solving > Programmers' 카테고리의 다른 글
| [Programmers] 부분 문자열 이어 붙여 문자열 만들기 - Java (0) | 2025.05.06 |
|---|---|
| [Programmers] n보다 커질 때까지 더하기 - Java (0) | 2025.05.05 |
| [Programmers] 서버 증설 횟수 - Java (0) | 2025.03.27 |
| [Programmers] 뒤에 있는 큰 수 찾기 - Java (0) | 2025.03.24 |
| [Programmers] 숫자 변환하기 - Java (0) | 2025.03.23 |