알고리즘 공부/위클리 챌린지

프로그래머스 위클리 챌린지 7주차 - java

철매존 2021. 9. 14. 21:31
728x90

문제 설명

1. 들어온 사람, 나온 사람이 주어진다.

2. 사람들이 차례로 들어오고, 현재 들어온 사람중 나온 사람에 해당하는 사람이 있으면 순서대로 나간다.

ex) enter -> [1, 4,3, 2]    leave -> [3, 4, 2, 1]    ----> 1번 입장, 4번 입장, 3번 입장, (여기서 leave의 처음인 3이 들어왔으니까) 3번 퇴장, 4번 퇴장, 2번 입장, 2번 퇴장, 1번 퇴장 요런식

3. 입장한 사람들끼리는 서로 만난다.

3. 만난 사람들의 수를 return한다.

풀이 과정

 1. 굉장히 간단한 문제이다.

 2. 선입선출법이니까 Queue를 사용하고, 사람들의 입/퇴장을 세 주므로 ArrayList로 사람들을 구한다.

 3. 전부 다 나가면 계산이 종료되므로 leave관련 queue가 사라질 때까지 해준다.

 4. 현재 입장한 사람들 중 나갈 사람이 있다면, 그 사람과 만난 사람들에 +1을 해주고, 그 사람은 만난 사람들의 수만큼 더해준다. 그리고 내보냄

 5. 현재 입장한 사람들 중 나갈 사람이 없다면, 새로운 사람을 들여보내준다.

--> 참고로 둘의 숫자들은 모두 겹치기 때문에 나갈 사람이 없는데 들어올 사람이 없는 경우는 자동으로 없을 것이다.

코드

import java.util.*;

class Solution {
    public int[] solution(int[] enter, int[] leave) {
        int[] answer = new int[enter.length];	// 답
        Queue<Integer> enterHuman = new LinkedList<>();	  // 들어올 사람
        Queue<Integer> leaveHuman = new LinkedList<>();   // 나갈 사람
        ArrayList<Integer> occupant = new ArrayList<>();  // 현재 사람
        
        for(int i : enter) enterHuman.add(i-1);  // 배열로 맞추기 위해 1을 빼줌
        for(int i : leave) leaveHuman.add(i-1);
        
        while(!leaveHuman.isEmpty()){		// 다 나갈때까지 진행~
            int planed = leaveHuman.peek();	// 나갈예정인 사람
            if(occupant.contains(planed)) {	// 나갈사람이 있다?
                leaveHuman.remove(); 		// 이사람은 무조건 나간다.
                occupant.remove(Integer.valueOf(planed));  // 전체 사람 중 이사람은 나간다.
                Iterator<Integer> iter = occupant.iterator();
                while(iter.hasNext()){	// 전체 사람에 대해
                    answer[iter.next()]++;	// 다른 사람들은 이 사람을 만났다.
                    answer[planed]++; 		// 이 사람은 다른 모든 사람들을 만났다.
                }
            }else{		// 나갈 사람이 없다?
                occupant.add(enterHuman.poll());		// 새로운 사람 입장
            }
        }
        
        return answer;
    }
}