문제 url:
회사에 있는 사람
문제:
문제를 읽어보면, 현재 상태가 enter인 직원들을 내림차순으로 출력하는 문제이다.
지금까지 Map 자료구조를 사용해왔던 사람이라면, 바로 떠올릴 수 있는 문제라고 본다.
Map은 Key값에 대한 Value를 가지고 있으며, Key값은 중복값을 허용하지 않는 특징이 있다.
이를 이용해서 코드로 같이 살펴보자
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sbd = new StringBuilder();
int N = Integer.parseInt(br.readLine());
HashMap<String, String> enter_log = new HashMap<>();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
enter_log.put(st.nextToken(), st.nextToken());
}
// 정렬을 하기 위함 하지만, 빈 공간이 없어야 하기 때문에
// List 자료구조 채택
List<String> reverse_sort = new ArrayList<>();
// keySet은 Map에 존재하는 모든 key값을 set 구조로 반환
for(String key : enter_log.keySet()) {
if(enter_log.get(key).equals("enter")) {
reverse_sort.add(key);
}
}
// 오름차순 정렬
Collections.sort(reverse_sort);
// 역순부터 정렬하기 위한 로직
for(int i = reverse_sort.size() - 1; i >= 0; i--) {
sbd.append(reverse_sort.get(i)).append("\n");
}
System.out.println(sbd);
}
}
여기서 궁금해 할만한 로직만 설명을 하자면
List<String> reverse_sort = new ArrayList<>();
첫 번째, 이 친구의 존재 여부이다.
해당 리스트는 enter인 직원 명단을 내림차순을 하기 위한 리스트로 처음에는 배열로 만들었다. 하지만, 배열의 크기는 가변이 아닌 고정인 것을 다들 알고 있을텐데,
그렇다면 만약 배열의 크기가 원소보다 크다면?? 빈 공간은 null로 표시되어
필자는 배열에서 list구조로 변환했다.
(간략히 말한다면, 배열의 고정 길이 단점때문에 가변 길이인 List 구조 채택)
// keySet은 Map에 존재하는 모든 key값을 set 구조로 반환
for(String key : enter_log.keySet()) {
if(enter_log.get(key).equals("enter")) {
reverse_sort.add(key);
}
}
두 번쨰, keySet() 메서드
KeySet() :
Set keySet() -> Set타입으로 맵에 포함된 키를 반환합니다.
Java SE 8 공식 api 문서
해당 메서드를 통해 현재 Map에 존재하는 키값을 불러와서 해당 Value가 "enter"인지 비교해 맞다면, 리스트에 주입하는 로직이다.
HashMap에 더 자세히 알고 싶다면 아래 링크를 보면 좋다.
[Java] 해시맵(HashMap)? 그게 뭔데 사용법 & 개념 정리
문제를 제대로 읽지 않아 출력문에서 역순으로 하지 않았다.. 거기서 시간을 뻇겼는데, 문제를 처음 시작할 때 꼼꼼하게 읽고 들어가는 습관이 필요할 것 같다.
또한, 오늘 배열을 해서 발생한 빈공간(null) 발생 문제를 경험할 수 있어서 가변길이 특징을 가진 List 구조를 채택해보는 등 여러 접근을 경험해본 문제였다.