문제
현수는 열기구 여름특강의 강사다. 현수는 매우 성실해서 모든 수강생들의 열기구 비행을 기록하고있다. 매 비행 이후, 현수는 그 비행에 참석한 수강생들의 기록을 리스트에 추가한다. 리스트에는 각 수강생마다 띄웠던 기구의 인식번호만이 기록된다.
매 시즌이 끝난 후, 현수는 얼마나 많은 종류의 열기구들을 비행해봤는지에 따른 수강생들의 숙련도를 분류해 나열하려고한다. 만약 두 수강생이 비행했던 열기구의 종류들이 같다면 두 수강생은 같은 숙련도를 가진것으로 분류된다. (이 경우, 비행을 한 횟수는 관계가 없다.)
현수는 총 9 종류의 열기구를 관리하며, 수강생들의 기록은 각 열기구의 번호들로써 이루어진다. 모든 수강생들 중 비행 횟수가 9번을 넘는 수강생은 없다. (1번 열기구를 세번 2번과 3번을 각각 한번씩 운용했던 수강생의 번호는 11123이 되겠다.)
예를 들어, 수강생 234423과 수강생 342는 같은 숙련도를 가진 것으로 분류된다. 하지만 수강생 118821과 수강생 1189821 같은 경우는 9번 열기구 비행 유무의 차이로 다른 숙련도를 가진 것으로 분류된다.
현수의 리스트에 있는 수강생들이 총 몇개의 숙련도로 분류되는지 구하라.
입력
각 테스트케이스마다 첫 줄에는 총 수강생의 수인 정수 N(1 ≤ N ≤ 1 000) 이 주어진다.
이어지는 N줄은 열기구 비행 기록을 나타내는 각 수강생들의 번호들이 주어진다.
출력
매 테스트케이스마다 각 줄에 현수의 리스트에 있는 수강생들의 숙련도가 몇 개로 분류되어지는지 출력하라.
해결 방법
- 입력이 있는 동안 while문을 돌려 테스트케이스를 입력받는다.
- HashSet을 사용하여 숙련도에서 중복을 없앤다.
- 중복을 없앤 set을 String으로 변환해 다른 HashSet에 넣어 중복을 없앤다.
- set을 그냥 HashSet에 넣으면 다른 객체라고 판단하여 중복이 없어지지 않는다.
- 전체 수강생의 정보가 담겨있는 set의 size를 구해 StringBuilder에 추가한다.
- while문이 종료되면 sb를 출력한다.
코드
// 현수의 열기구 교실
public class Week09_13915 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String testcaseStr = "";
StringBuilder sb;
StringBuilder result = new StringBuilder();
while ((testcaseStr = br.readLine()) != null) { // 이거 없으면 50%에서 틀렸습니다 나온다
HashSet<String> set = new HashSet<>();
int testcase = Integer.parseInt(testcaseStr);
for (int i = 0; i < testcase; i++) {
Set<Integer> number = new HashSet<>();
sb = new StringBuilder();
String[] temp = br.readLine().split("");
for (String s : temp) {
number.add(Integer.valueOf(s));
}
for (int n : number) {
sb.append(String.valueOf(n));
}
set.add(String.valueOf(sb));
}
result.append(set.size() + "\n");
}
System.out.println(result.toString());
}
}
'algorithm' 카테고리의 다른 글
| [BOJ] 10971. 외판원 순회2 (4) | 2024.09.03 |
|---|---|
| [BOJ] 22252. 정보 상인 호석 (0) | 2022.12.11 |
| [BOJ] 4358. 생태학 (0) | 2022.12.11 |
| [BOJ] 1965. 상자넣기 (0) | 2022.12.11 |
| [BOJ] 1890. 점프 (0) | 2022.12.11 |