문제 : boj25757
필요 알고리즘 개념
- 해시를 사용한 집합과 맵, 문자열
- 문자열을 사용해 해싱하는 문제이다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
우선 Y, F, O에 대해 임스는 무조건 포함되어야 하니 각각 추가로 1, 2, 3명의 인원수가 필요하다. Y에 따른 추가 인원수를 p라고 해보자.
이제 알아야 하는건 '최대 몇 번이나 임스와 함께 게임을 플레이할 수 있는지'와 '임스는 한 번 같이 플레이한 사람과는 다시 플레이하지 않습니다.' 부분을 처리하는 것이다. 이 둘을 하나로 섞어보면 즉, '입력으로 들어온 사람 중 중복으로 들어온 사람을 제외한 사람의 수'가 될 것이다.
예를들어서 아래와 같은 경우 총 7번의 입력이지만, 중복되지 않는 사람의 수는 a, b, c로 3명 뿐이다.
c
c
a
b
a
b
c
입력은 String으로 들어오므로 중복 확인은 HashSet<String>을 사용해주면 된다. 그리고 최종적으로 '중복되지 않은 사람의 수 / p'를 소수점을 잘라 내림으로 출력해주면 된다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;
public class Main {
private int getPlayerExceptLms(char c) {
switch (c) {
case 'Y': return 1;
case 'F': return 2;
case 'O': return 3;
}
return -1;
}
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int p = getPlayerExceptLms(st.nextToken().charAt(0));
HashSet<String> hs = new HashSet<>();
int cnt = 0;
while (n-->0) {
String cur = br.readLine();
cnt += hs.contains(cur)?0:1;
hs.add(cur);
}
System.out.println(cnt/p);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 16395 - 파스칼의 삼각형 (java) (0) | 2022.10.25 |
---|---|
[자바] 백준 12400 - Speaking in Tongues (Small) (java) (0) | 2022.10.24 |
[자바] 백준 25756 - 방어율 무시 계산하기 (java) (0) | 2022.10.24 |
[자바] 백준 11068 - 회문인 수 (java) (0) | 2022.10.21 |
[자바] 백준 10986 - 나머지 합 (java) (0) | 2022.10.20 |
댓글