데이터 엔지니어링 정복/Algorithm
[그리디] 프로그래머스 - 체육복 (java & python)
eeaarrtthh
2022. 7. 21. 10:30
728x90
반응형
-문제
https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=python3
-자바 풀이
import java.util.Arrays;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
//밑에 비교하는 반복문에서 0이나 n에서 앞뒤학생비교시
//값이 없으면 Out of Index에러나옴, 이를 피하기 위해 n+2로 만든다.
int[] students = new int[n+2];
//일단 모든 학생이 체육복을 가져온 것으로 한다.
Arrays.fill( students, 1 );
students[0] = students[n+1] = 0;
//reserve 학생들 +1
for( int i=0; i<reserve.length; i++ ) students[reserve[i]]++;
//lost 학생들 -1
for( int i=0; i<lost.length; i++ ) students[lost[i]]--;
//체육복없는 학생들 빌려주기
for( int i=1; i<=n; i++ ) {
if( students[i]==0 ) {
//앞 학생이 여벌있을 때
if( students[i-1]==2 ) {
students[i-1]--;
students[i]++;
//뒤 학생이 여벌있을 때
} else if( students[i+1]==2 ) {
students[i+1]--;
students[i]++;
}
}
}
//체육복 가지고 있는 학생 수 세기
for( int i=1; i<=n; i++ )
if( students[i]!=0 ) answer++;
return answer;
}
}
-파이썬풀이
def solution(n, lost, reserve):
answer = 0
#두 배열에 공통요소를 빼준다.
reserve_new = set(reserve)-set(lost)
lost_new = set(lost)-set(reserve)
#여벌 가져온 학생 순회하면서
#앞뒤 학생 중 분실된 학생 있는지 조사
#있으면 체육복 빌려주고 분실된 학생 배열에서 제외
for i in reserve_new:
if i-1 in lost_new:
lost_new.remove(i-1)
elif i+1 in lost_new:
lost_new.remove(i+1)
answer = n - len(lost_new)
return answer
728x90
반응형