풀이방법
사용된 것:
HashSet
2022.08.24
중복체크를 해야 하므로 HashSet를 사용하여 풀었다.
참가자들이 3번의 게임에서 낸 숫자들을 일단 모두 읽어온다.
먼저, 각 회차마다 0점처리해야 하는 숫자를 해시셋에 넣어두는 작업을 한다.
회차가 3개이므로 해시셋 3개의 배열을 만든다. 이것을 dup라고 하겠다.
각 회차마다 참가자들이 낸 숫자들을 모두 훑으면서
중복되는 수를 그 회차를 담당하는 해시셋에 넣어둔다.
이제 점수를 계산한다.
dup에 들어있는 숫자라면 0점을, 그렇지 않다면 낸 숫자만큼을 점수에 추가해주면 된다.
EDOC MT 팀대항전에서 푼 문제이다.
코드
Java(2022.08.24)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
//숫자 배열
int[][] nums = new int[n][3];
//읽어오기
for(int i=0; i<n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
nums[i][0] = Integer.parseInt(st.nextToken());
nums[i][1] = Integer.parseInt(st.nextToken());
nums[i][2] = Integer.parseInt(st.nextToken());
}
//각 라운드별, 0점처리해야 하는 숫자의 목록을 담을 해시셋
Set<Integer>[] dup = new HashSet[3];
for(int i=0; i<3; i++) {
dup[i] = new HashSet<Integer>();
}
//중복되는 수들을 0으로 바꾸기
//3개의 라운드에 대하여
for(int i=0; i<3; i++) {
Set<Integer> hs = new HashSet<Integer>(); //중복점검용 해시셋
//이번 판의 모든 사람의 숫자에 대하여
for(int j=0; j<n; j++) {
//만약 hs에 안 들어있는 수라면 새로 넣기
if(!hs.contains(nums[j][i])) hs.add(nums[j][i]);
//hs에 들어있는 숫자(중복)라면 dup에 넣기
else dup[i].add(nums[j][i]);
}
}
//점수계산
int[] score = new int[n]; //각 사람의 점수
//각 사람에 대하여
for(int i=0; i<n; i++) {
//3개 라운드에 대하여
for(int j=0; j<3; j++) {
if(!dup[j].contains(nums[i][j])) score[i] += nums[i][j];
}
}
for(int i: score) System.out.println(i);
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
#3226 : 전화 요금 (0) | 2022.09.03 |
---|---|
#10820 : 문자열 분석 (0) | 2022.09.03 |
#1446 : 지름길 (0) | 2022.08.17 |
#1940: 주몽 (0) | 2022.08.12 |
#1010: 다리 놓기 (0) | 2022.08.09 |