프로그래머스 위클리 챌린지 7주차 (자바)
🍀 문제
사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다.
오늘 회의실에는 총 n명이 입실 후 퇴실했습니다. 편의상 사람들은 1부터 n까지 번호가 하나씩 붙어있으며, 두 번 이상 회의실에 들어온 사람은 없습니다. 이때, 각 사람별로 반드시 만난 사람은 몇 명인지 구하려 합니다.
회의실에 입실한 순서가 담긴 정수 배열 enter, 퇴실한 순서가 담긴 정수 배열 leave가 매개변수로 주어질 때, 각 사람별로 반드시 만난 사람은 몇 명인지 번호 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
입출력 예
enter | leave | result |
[1,3,2] | [1,2,3] | [0,1,1] |
[1,4,2,3] | [2,1,3,4] | [2,2,1,3] |
https://programmers.co.kr/learn/courses/30/lessons/86048
코딩테스트 연습 - 7주차
사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다. 오늘 회의실에는
programmers.co.kr
😊 나의 코드
import java.util.*;
class Solution {
public int[] solution(int[] enter, int[] leave) {
int[] answer = new int[enter.length];
int index = 0;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<enter.length; i++) {//입실한 순서대로
for(Integer j : map.keySet()) {
//1. 새로운 사람이 방에 들어감으로 방에 있는 사람의 value 값 1 더해줌
map.put(j,map.get(j)+1);
}
//2. 입실한 사람 map에 저장(value는 방에 남아있는 사람수)
map.put(enter[i], map.size());
while(index<enter.length && map.containsKey(leave[index])) {
int leaveNum = leave[index]; //퇴실자 넘버
answer[leaveNum-1] = map.get(leaveNum);//만난 사람수 answer에 저장
map.remove(leaveNum);//3. 퇴실자는 방에서 퇴실(map에서 삭제)
index++;
}
}
return answer;
}
}
HashMap map에 회의실에 들어간 사람들의 정보를 저장한다.
(key : 입실자 넘버 / value : 만난 사람수)
회의실에 입실하면 map에 저장 / 퇴실하면 map에서 삭제한다.
1. 새로운 사람이 방에 들어가면 방 안(map)에 남아있는 사람들의 만난 사람수를 1씩 증가 (value 값을 1씩 증가) 시킨다.
for(Integer j : map.keySet()) {
map.put(j,map.get(j)+1);
}
2. 방에 입실할 때 map에 저장한다. (key : 입실자 넘버 / value : 방에 남아 있는 사람수 = map.size())
map.put(enter[i], map.size());
3. 방에 퇴실할 때 map에서 삭제한다.
map.remove(leaveNum);
퇴실할때 (map에서 remove하기 전) answer 배열에 만난 사람수를 저장해서 마지막에 answer 배열을 리턴하였다.