반응형
문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
입출력 예
n lost reserve return
5 | [2, 4] | [1, 3, 5] | 5 |
5 | [2, 4] | [3] | 4 |
3 | [3] | [1] | 2 |
입출력 예 설명
예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.
예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.
문제 접근
- 문제 태그에서 처음부터 탐욕법으로 지정해놓은 문제이고 저는 이문제를 처음으로 탐욕법으로 풀었습니다
- 탐욕법을 생각을 했을때는 앞뒤에 있는 일을 생각하지 않고 오로지 주어진 조건에 최적의 선택을 하는 것이라고 생각하면서 문제를 접근하였습니다.
- uniform이라는 배열을 만들고 1의 값을 부여하였습니다.
- lost의 값을 uniform 배열에 매핑하여 체육복을 잃어 버린 사람에게 -1을 하였습니다.
- reserve 의 값을 uniform 배열에 매핑하여 체육복을 빌려줄수 있는 사람에게 +1을 하였습니다.
- 0부터 n가지 반복문을 선언하고 체육복 여분이 2보다 작을경우에는 continue를 하였고 체육복 여분이 있는 사람에게는 앞 뒤 사람에 0 일경우 자신은 -1 빌려준 사람에게는 +1을 하였습니다.
- 마지막으로 배열에 0아닌경우만 개수를 count 하여 return 하도록 하였습니다.
import java.util.Arrays;
import java.util.stream.IntStream;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
int[] uniform = new int[n];
IntStream.range(0,n).forEach(i-> uniform[i] =1);
Arrays.stream(lost).map(i -> i-1).forEach( i -> uniform[i] -= 1);
Arrays.stream(reserve).map(i->i-1).forEach(i->uniform[i] +=1);
for (int i = 0; i< n ;i++){
if(uniform[i] < 2) continue;
if((i-1) >= 0 && uniform[i-1] == 0){
uniform[i] -=1;
uniform[i-1] +=1;
}else if((i+1) < n && uniform[i+1] == 0){
uniform[i] -=1;
uniform[i+1] +=1;
}
}
return (int) Arrays.stream(uniform)
.filter(i->i!= 0).count();
}
}
배울점
- 사실 위 코드는 제가 푼 코드는 아니고 스터디를 하면서 나온 코드 입니다.
- 이번 문제에서는 Stream을 많이 사용하려고 노력하였습니다. 아직 Stream 사용에 미숙하고 많이 사용하지 못하였지만 Stream에 장점인 가독성을 높히기 위해서 앞으로 쓰는 연습을 해야겠다라는 생각을 했습니다.
- Steram API 를 참고하여 자바 이야기 카테고리에 Stream에대한 정리가 필요한것 같습니다.
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Level 2 ] 전화번호 목록 (0) | 2020.01.10 |
---|---|
[프로그래머스 Level 2] 탑 (Stack 문제) (0) | 2019.12.30 |
[프로그래머스 level 1] 문자열 압축 2020카카오 블라인트 채용 문제 (0) | 2019.10.30 |
[프로그래머스 level 2] 다음 큰숫자 (0) | 2019.10.27 |
[프로그래머스 Level 1] 하샤드의 수 (0) | 2019.10.27 |