[ Programmers ] 체육복 (Java)

ma.caron_g·2021년 12월 3일
0

Lv.1 - Programmers (완성)

목록 보기
62/74
post-thumbnail

1. Problem 📃

[ 체육복 ]

https://programmers.co.kr/learn/courses/30/lessons/42862



2. Constraint 🔗



3. Solution 🔑

  1. 우선 보기 쉽게 배열을 한 칸 더 선언해서 학생 번호를 보기 쉽게 선언하였다.
    첫번째 학생은 값 변동이 없으므로 0값(본인 체육복만 있는 학생)이 들어오기도 하고 for문을 1번 부터 돌려 0번을 스킵한다.
  2. students배열에 lost 값에 해당하는 학생은 감소(--)를, reserve 값에 해당하는 학생은 증가(++)를 하여
    체육복을 잃어버린 학생(-1) / 본인 체육복만 있는 학생(0) /여벌 체육복이 있는 학생(1)으로 표현
  3. 학생 번호를 하나씩 확인하며 체육복을 잃어버린 학생(-1)값에 해당하면 앞 또는 뒷 번호가 여분이 있는 학생(1)인지 확인하고 있다면 해당 두 학생 모두 본인 체육복만 있는 학생(0)으로 수정한다.
  4. 본인 앞의 학생이 여분 체육복이 있으면 문제가 없지만 / for문의 인덱스(i)가 마지막 번호 보다 작을 때 (그래야 뒷자리에 누군가가 있기 때문에 / 마지막 학생에 +1을 하면 인덱스 초과 오류 발생) 뒤에 학생이 여분이 있으면 체육복을 빌린다.
  5. 마지막 학생은 자동으로 앞에 학생을 보고 체육복을 대여 여부를 결정.
  6. for문을 통해 students배열 요소에 0보다 큰 수(본인 또는 본인과 여분 옷이 있는 경우)인 경우를 카운트 해주어 그 값을 리턴.

4. Code 💻

class Solution {
	public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        
        int[] students = new int[n+1];
        
        //-1 :체육복을 놓고 온 학생
        // 0 :체육복 본인꺼만 있는 학생
        // 1 :여벌의 체육복을 챙긴 학생
        for(int l : lost) {
        	 students[l]--;
        }
        for(int r : reserve) {
        	students[r]++;
        }
        
        for(int i=1; i<students.length-1; i++) {
        	if(students[i] == -1) {
        		if(students[i - 1] == 1) {
        			students[i] = 0;
        			students[i - 1] = 0;
        		}
        		else if(i < students.length-1 && students[i + 1] == 1) {
        			students[i] = 0;
        			students[i + 1] = 0;
        		}
        	}
        }
        for(int i=1; i<students.length; i++) {
        	if(students[i] >= 0) {
        		answer++;
        	}
        }
        
		return answer;
	}
}

7. Growth 🍄

탐욕법(Greedy) 알고리즘이란?
다음 단계를 생각하지 않고, 각 단계에서 가장 좋다고 생각하는 것을 선택하는 기법이다.
profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글