제이슨의 개발이야기
프로그래머스 입실 퇴실 코틀린Kotlin 위클리 7주차 본문
https://programmers.co.kr/learn/courses/30/lessons/86048
코딩테스트 연습 - 7주차
사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다. 오늘 회의실에는
programmers.co.kr
안녕하세요!
오늘은 프로그래머스 2단계 문제 입실 퇴실 문제를 풀어봤습니다!
문제 설명
사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다.
오늘 회의실에는 총 n명이 입실 후 퇴실했습니다. 편의상 사람들은 1부터 n까지 번호가 하나씩 붙어있으며, 두 번 이상 회의실에 들어온 사람은 없습니다. 이때, 각 사람별로 반드시 만난 사람은 몇 명인지 구하려 합니다.
예를 들어 입실 명부에 기재된 순서가 [1, 3, 2], 퇴실 명부에 기재된 순서가 [1, 2, 3]인 경우,
- 1번과 2번은 만났는지 알 수 없습니다.
- 1번과 3번은 만났는지 알 수 없습니다.
- 2번과 3번은 반드시 만났습니다.
또 다른 예로 입실 순서가 [1, 4, 2, 3], 퇴실 순서가 [2, 1, 3, 4]인 경우,
- 1번과 2번은 반드시 만났습니다.
- 1번과 3번은 만났는지 알 수 없습니다.
- 1번과 4번은 반드시 만났습니다.
- 2번과 3번은 만났는지 알 수 없습니다.
- 2번과 4번은 반드시 만났습니다.
- 3번과 4번은 반드시 만났습니다.
회의실에 입실한 순서가 담긴 정수 배열 enter, 퇴실한 순서가 담긴 정수 배열 leave가 매개변수로 주어질 때, 각 사람별로 반드시 만난 사람은 몇 명인지 번호 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ enter의 길이 ≤ 1,000
- 1 ≤ enter의 원소 ≤ enter의 길이
- 모든 사람의 번호가 중복없이 하나씩 들어있습니다.
- leave의 길이 = enter의 길이
- 1 ≤ leave의 원소 ≤ leave의 길이
- 모든 사람의 번호가 중복없이 하나씩 들어있습니다.
입출력 예
enter | leave | result |
[1,3,2] | [1,2,3] | [0,1,1] |
[1,4,2,3] | [2,1,3,4] | [2,2,1,3] |
[3,2,1] | [2,1,3] | [1,1,2] |
[3,2,1] | [1,3,2] | [2,2,2] |
[1,4,2,3] | [2,1,4,3] | [2,2,0,2] |
이 문제를 어떻게 풀까 고민했는대
저 같은 경우
입실한 사람을 저장하는 해시맵을 만든 다음
leave 배열의 인덱스 순서에 따라서 해시맵 안에 존재하는지 확인후
존재 하지 않으면 enter 배열의 데이터를 하나씩 해시맵에 넣는 반복문을 만들었습니다
새로운 입실자가 생겼을 때는 기존의 입실자의 value값을 1씩 증가하고
새로운 입실자의 value 는 해당 해시맵의 사이즈 를 넣었습니다!
만약 해시맵의 존재하는 입실자가 퇴실을 하게 될 경우
answer 배열에 적합한 인덱스에 해시맵의 value 값을 넣었습니다!
간단하게 정리하자면
퇴실자가 현재 입실 되어있는지 확인 후(해시맵의 key 값들 중 있는지 확인)
현재 퇴실자가 아직 입실 하지 않았다면 해시맵에 새로운 입실자를 넣고
만약 퇴실자가 현재 입실되어있다면
answer 배열에 value값을 넣은다음
해시맵의 해당 데이터를 remove 합니다!
class Solution {
fun solution(enter: IntArray, leave: IntArray): IntArray {
var answer: IntArray = IntArray(enter.size)
var enterIndex = 0
var leaveIndex = 0
var enterHash = HashMap<Int , Int>()
while (true){
if(leaveIndex!=leave.size){
if(enterHash.keys.contains(leave[leaveIndex]).not()){
for(key in enterHash.keys){
enterHash.put(key , enterHash.get(key)!!+1)
}
enterHash.put(enter[enterIndex++],enterHash.keys.size)
}else{
answer[leave[leaveIndex]-1] = enterHash.get(leave[leaveIndex])!!
enterHash.remove(leave[leaveIndex])
leaveIndex++
}
}else{
break
}
}
return answer
}
}
'코딩테스트' 카테고리의 다른 글
프로그래머스 가장 큰 정사각형 찾기 자바 (0) | 2021.09.19 |
---|---|
프로그래머스 JadenCase 문자열 만들기 코틀린 (0) | 2021.09.17 |
프로그래머스 숫자의 표현 자바 (0) | 2021.09.12 |
프로그래머스 [1차] 비밀지도 자바 2018 KAKAO BLIND RECRUITMENT (0) | 2021.09.08 |
프로그래머스 [1차] 다트 게임 자바 2018 KAKAO BLIND RECRUITMENT (0) | 2021.09.08 |