난이도: 레벨 1
예상 태그: 구현, 시뮬레이션
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/258712
푸는 데 걸린 시간: 50m
A와 B 사이에 주고 받은 선물 중에서 누가 더 많이 주었는지를 판단해야한다. 행에 있는 사람이 giver, 열에 있는 사람이 taker인 테이블을 만들어야 한다.
이때 사람의 리스트가 String[]으로 주어지는데 테이블을 만들려면 사람을 인덱스로 바꾸어야하기 때문에 "key = 사람이름, value = 인덱스"인 HashMap을 선언해준다.
전체적인 풀이과정은 아래와 같다.
import java.util.*;
class Solution {
public int solution(String[] friends, String[] gifts) {
int answer = 0;
int[] count = new int[friends.length];
int[][] table = new int[friends.length][friends.length];
Map<String, Integer> map = new HashMap<>();
// 맵 만들기
for(int i=0; i<friends.length; ++i) {
map.put(friends[i], i);
}
// 초기화
for(int i=0; i<friends.length; ++i) {
for(int j=0; j<friends.length; ++j) {
table[i][j] = 0;
}
count[i] = 0;
}
// 선물 테이블 만들기
for(int i=0; i<gifts.length; ++i) {
StringTokenizer st = new StringTokenizer(gifts[i]);
int giver = map.get(st.nextToken());
int taker = map.get(st.nextToken());
table[giver][taker] += 1;
}
// 1을 이중 포문으로 돌기
for(int i=0; i<friends.length; ++i) {
for(int j=0; j<friends.length; ++j) {
// if(i==j) continue;
if(i >= j) continue; // 중복
int i_give = table[i][j], j_give = table[j][i];
if(i_give > j_give) {
count[i] += 1;
} else if(i_give < j_give) {
count[j] += 1;
} else { // 같음. 선물 지수 구하기
int i_score = 0;
int give = 0, take = 0;
for(int k=0; k<friends.length; ++k) {
give += table[i][k];
take += table[k][i];
}
i_score = give - take;
int j_score = 0;
give = 0; take = 0;
for(int k=0; k<friends.length; ++k) {
give += table[j][k];
take += table[k][j];
}
j_score = give - take;
if(i_score > j_score) {
count[i] += 1;
} else if(i_score < j_score) {
count[j] += 1;
}
}
}
}
// 가장 큰 값 구하기
answer = count[0];
for(int cnt : count) {
if(answer < cnt) answer = cnt;
}
return answer;
}
}
쉬운 구현 문제인데 50분이 걸렸다.. 그 이유는
풀이만 쓰지 말고 슈도 코드도 한번 써봐야 하나..? 싶다.
이런 자잘한 실수는 어떻게 빨리 파악할 수 있는 것일까