데이터 엔지니어링 정복/Algorithm

[그리디] 프로그래머스 - 체육복 (java & python)

eeaarrtthh 2022. 7. 21. 10:30
728x90
반응형

-문제

https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

-자바 풀이

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
반응형