[JAVA-5]프로그래머스 1단계 : 체육복

이지연·2020년 12월 19일
0

[JAVA]프로그래머스

목록 보기
5/9


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

문제

문제 설명

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

풀이 과정

  • int n = 5; //전체학생수
    int[] lost = {2,4}; //체육복을 도난당한 학생들의 번호가 담긴 배열
    int[] reserve = {3}; //여벌의 체육복을 가져온 학생들의 번호
    int[] people = new int[n]; //체육수업을 들을 수 있는 학생의 최댓값

(1) i = 2,4
people[i-1] -> n의 값은 5인데, 배열은 0부터 시작이니까 -1을 해준다.
뒤에 --를 해준 건 0이라고 지정해서 빌려줄 값이 없다고 생각

(2) j = 1,3,5
people[i-1] -> 똑같이 해당 인덱스값이 나오도록 -1을 해준다.
여벌을 가져온 학생들은 ++를 해서 1이라고 해놓기

(3) i를 0부터 people의 길이인 5까지 for문을 돌리는데,
people[i] == -1이면,

처음에 people의 초기값은 {0,0,0,0,0}인데 (1)과(2)의 과정을 통해서 people : {0, -1, 1, -1, 0} 된다.

여기서, people[i]값이 0이라는 건 즉, 체육복을 잃어버린 사람들을 의미한다.

(4) 여기서, 첫번째가 아니고(and) 내 앞사람이 1임을 알 수 있고, 여분을 가져온 사람이면 i번째 인간이 빌려와 0을 해주고 앞사람을 -1을 해준다.

(5) 내가 마지막 사람이 아니면서 내 뒷사람이 1이며, 뒷 사람한테 빌린다.

(6) 그리고 0인 값만 answer에 넣어줘서 출력한다.

문제풀이

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
    	int answer = 0;
        int[] people = new int[n]; 
        
        //(1)
        for(int i: lost) { 
        	people[i-1]--;	 
        }
        
        //(2)
        for(int j: reserve) { 
        	people[j-1]++;
        }
        
        
        for(int i=0; i<people.length;i++) {
        	//(3)	
        	if(people[i] == -1) { 
        		//(4)
                if(i>0 && people[i-1] == 1) { 
        			people[i]++; 
        			people[i-1]--;
        		//(5)
                }else if(i < people.length-1 && people[i+1] ==1) {
        			people[i]++;
        			people[i+1]--;
        		}
        	}
        }
        //(6)
        for(int i : people) {
        	if(i == 0) {
        		answer++;
        	}
        }
        
		return answer;
    }
 }
profile
Everyday STEP BY STEP

0개의 댓글