✅ 문제
문제링크
🔗 https://www.acmicpc.net/problem/7785
✅ 풀이
🔹 코드 1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Map<String, String> workingList = new HashMap<>();
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
workingList.put(st.nextToken(), st.nextToken());
// put()메서드는 같은 키가 이미 존재하는 경우 매핑되는 값이 변경된다.
}
List<String> keyList = new ArrayList<>(workingList.keySet());
Collections.sort(keyList, Collections.reverseOrder());
StringBuilder sb = new StringBuilder();
for (String s : keyList) {
if (workingList.get(s).equals("enter")) {
sb.append(s).append("\n");
}
}
sb.setLength(sb.length() - 1);
System.out.println(sb);
}
}
문제에서 제시하는 조건을 상세하게 읽고 꼭 조건에 맞게 코드를 설계하도록 하자❗
이름을 key
값으로 저장하고 value
값으로 enter
, leave
정보를 저장하도록 하자.
HashMap
을 사용하면 된다.
HashMap
객체를 생성하도록 하고 workingList
변수에 참조값을 저장하도록 하자.
for문 반복을 통해 put()
메서드를 사용해 key
와 value
값을 넣어주도록 한다.
HashMap
은 순서가 보장되지 않으므로 문제에서 출력에 현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다는 조건을 지키기 위해 ArrayList
를 사용하도록 하자.
List<String> keyList = new ArrayList<>(workingList.keySet());
하여 ArrayList
객체를 생성하고 keySet()
메서드를 사용해 key
값들을 넣어주도록 한다.
Collections
클래스에 sort()
메서드를 사용해 정렬하도록 하는데 두번째 인자로 Collections.reverseOrder()
을 주어 사전 순의 역순으로 정렬하도록 한다.
foreach문을 통해 String s
에 keyList
의 값을 하나씩 받고 if문에 HashMap
클래스의 get()
메서드를 통해 해당 키값의 value
값을 가져오고 equals()
메서드를 통해 value
값이 "enter"
인지 확인한다.
true
이면 StringBuilder sb
에 append()
메서드를 사용해 넣어주도록 한다.
sb
를 출력한다.
🔹 결과 1
🔹 코드 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Map<String, String> workingList = new HashMap<>();
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
String name = st.nextToken();
// 이미 key가 있다면 leave 하는 것이므로 제거해준다.
if (workingList.containsKey(name)) {
workingList.remove(name);
} else {
workingList.put(name, st.nextToken());
}
}
List<String> keyList = new ArrayList<>(workingList.keySet());
Collections.sort(keyList, Collections.reverseOrder());
StringBuilder sb = new StringBuilder();
for (String s : keyList) {
sb.append(s).append("\n");
}
sb.setLength(sb.length() - 1);
System.out.println(sb);
}
}
두번째 방법은 앞선 코드를 조금 변경해보았다.
만약 입력 받을 때 같은 key
값이 들어온다면 이는 leave
하는 것일 것이다.
따라서 같은 key
값이 들어온다면 HashMap
에서 제거하도록 한다면 일하는 중인 사람만 남게 될 것이다.
for문에 String name
에 이름을 입력받고 if문을 통해 containsKey()
메서드를 사용해 이미 키가 있으면 remove()
메서드를 사용해 제거해주도록 한다.
키가 없다면 put()
메서드를 사용해 넣어주도록 한다.
그 이후에는 앞에 방법과 같이 ArrayList
에 key
값들을 넣어주고 이를 역순으로 정렬하도록 하자.
그렇다면 이후 foreach문에서 ArrayList
에 있는 모든 값들은 일하는 중인 사람들만 남으므로 따로 if문을 사용할 필요가 없다.
StringBuilder sb
에 넣어주도록 하고 이를 출력한다.
🔹 결과 2
🔹 알게된 정보
- ⚠️ 문제의 조건을 상세히 읽어보도록 하자❗
HashMap
은 입력 순서를 보장하지 않는다.
'Problem Solving (Java) > 백준' 카테고리의 다른 글
[백준] 10816번 : 숫자 카드 2 (실버 Ⅳ) - Java/자바 (4) | 2025.06.15 |
---|---|
[백준] 1620번 : 나는야 포켓몬 마스터 이다솜 (실버 Ⅳ) - Java/자바 (2) | 2025.06.14 |
[백준] 14425번 : 문자열 집합 (실버 Ⅳ) - Java/자바 (2) | 2025.06.14 |
[백준] 10815번 : 숫자 카드 (실버 Ⅴ) - Java/자바 (0) | 2025.06.13 |
[백준] 10814번 : 나이순 정렬 (실버 Ⅴ) - Java/자바 (2) | 2025.06.11 |