728x90
https://www.acmicpc.net/problem/25757
25757번: 임스와 함께하는 미니게임
첫 번째 줄에는 사람들이 임스와 같이 플레이하기를 신청한 횟수 $N$과 같이 플레이할 게임의 종류가 주어진다. $(1 \le N \le 100\,000)$ 두 번째 줄부터 $N$개의 줄에는 같이 플레이하고자 하는 사람들
www.acmicpc.net
필요한 인원 수 고르기
게임이 윷놀이("Y")면 2명, 같은 그림찾기("F")면 3명, 원카드("O")면 4명이서 게임을 진행한다. 주인공 임스는 항상 게임에 참여하므로, 더 필요한 유저는 각각 1, 2, 3명인 셈이다. 여러가지 방법이 있겠지만, 삼항연산자를 연습해보고 싶어서 다음과 같이 작성했다.
String game = st.nextToken();
int gamer = game.equals("Y") ? 1 : game.equals("F") ? 2 : 3;
중복 지원 거르기
임스는 한 번 게임한 사람과는 다시 게임하지 않기 때문에 중복 체크를 해주어야 한다. String의 중복 체크는 보통 HashMap으로 해줬다. map.containsKey 함수가 O(1)의 시간만에 키값이 있는지 확인해주기 때문이다.
중복이 아닌 유저는 cnt로 세다가, cnt가 필요한 유저 수에 도달했을 때 초기화하고 total 값을 1 늘려주었다.
+) 생각해보니 굳이 매번 검사할 필요 없이 끝나고 cnt를 필요한 유저 수로 나눈 값과 동일하다. 즉, cnt / gamer로 계산한 값과 같다. 이렇게 답변을 변경해서 제출했는데, 기존 것 240ms, 변경 224ms로 시간이 조금 줄었다.
전체 코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
String game = st.nextToken();
int gamer = game.equals("Y") ? 1 : game.equals("F") ? 2 : 3; // 같이해야 하는 인원수
Map<String, Integer> map = new HashMap<>();
int cnt = 0;
int total = 0;
for (int i = 0; i < N; i++) {
String user = br.readLine();
if(!map.containsKey(user)) { // 이미 신청했던 유저라면
cnt++;
map.put(user, 1);
}
if(cnt == gamer) {
cnt = 0;
total++;
}
}
System.out.println(total);
}
}
반응형
'JAVA > 문제 풀이' 카테고리의 다른 글
[백준 / BOJ] 1158번 : 요세푸스 문제 (JAVA) (0) | 2023.08.14 |
---|---|
[백준 / BOJ] 14940번 : 쉬운 최단거리 (JAVA) (0) | 2023.08.13 |
[백준 / BOJ] 12851번 : 숨바꼭질 2 (JAVA) (0) | 2023.08.12 |
[백준 / BOJ] 9466번 : 텀 프로젝트 (JAVA) (0) | 2023.08.12 |
[백준 / BOJ] 1026번 : 보물 JAVA (0) | 2023.08.11 |