728x90
문제설명
입력 & 출력
나의 풀이
이번 백준 1296번 - 팀 이름을 정하자 문제는 주어진 팀 이름을 바탕으로 특정 공식을 사용하여 점수를 계산하고, 다른 팀들과 비교하여 가장 높은 점수를 얻는 팀을 출력하는 문제입니다.
문제의 핵심은 각 팀 이름을 이용해 점수를 계산하는 것이며, 해당 점수가 가장 높은 팀을 찾는 것입니다.
문제를 처음에는 이해가 잘 안됐는데, 문제 설명에서 나온 '연두의 이름과 팀 이름에서 등장하는 L의 개수' 라는 말처럼 각각의 팀마다 연두의 이름과 그 팀 이름을 합쳐서 'L,O,V,E'가 나오는 횟수를 구하고, 이를 공식에 대입해서 가장 높은 점수를 받는 팀을 구하는 문제입니다.
전체 코드
점수 계산 : getScore()
- getScore 메서드는 두 팀의 이름(연두의 팀, 다른 팀)을 입력받고, 각 문자의 등장 횟수를 getMap 메서드를 통해 계산합니다.
- 문자가 없을 수도 있기 때문에 getOrDefault()메서드로 문자가 없으면 기본값 0으로 설정하고 'L', 'O', 'V', 'E' 문자의 횟수를 구한 후, 문제에서 주어진 공식을 사용하여 점수를 계산합니다.
- 공식은: ((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100 입니다.
문자 등장 횟수 계산 : getMap()
- getMap 메서드는 두 팀 이름에서 'L', 'O', 'V', 'E' 문자의 등장 횟수를 계산합니다.
- myTeam과 otherTeam의 문자를 하나씩 확인하여 각 문자의 등장 횟수를 map에 기록합니다.
- getOrDefault()을 사용하여 해당 문자의 기존 값을 가져오고 없으면 0으로 초기화하여 1을 더합니다.
- 즉, 없으면 0 있으면 기본값을 시작으로 +1
main 문
- 먼저 BufferedReader로 입력을 받아주고, 연두의 팀과 다른팀의 개수 N을 받아줍니다.
- N개의 다른 팀 이름을 순차적으로 입력받고, 각 팀에 대해 점수를 계산합니다.
- getScore(yeondu, otherTeam) 메서드를 호출하여 연두 팀과 다른 팀의 점수를 계산합니다.
- 점수를 비교하여 더 높은 점수를 얻은 팀을 bestTeam에 저장합니다.
- 만약 점수가 같으면 사전순으로 더 앞선 팀을 선택합니다 (compareTo 메서드를 사용하여 문자열 비교).
ps
처음에는 getScroe함수가 너무 두꺼워지고 가독성이 좋지 않아서 HashMap관련 코드는 따로 함수로 빼려고 아래와 같이 작성했었습니다.
private static int getScore(String myTeam, String otherTeam){
HashMap<Character,Integer> map;
map = getMap(myTeam); // 연두 팀 계산
map = getMap(otherTeam); // 다른 팀 계산
// LOVE 각 문자의 개수 계산
int L = map.getOrDefault('L', 0);
int O = map.getOrDefault('O', 0);
int V = map.getOrDefault('V', 0);
int E = map.getOrDefault('E', 0);
// 공식 계산: ((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100
return ((L+O) * (L+V) * (L+E) * (O+V) * (O+E) * (V+E)) % 100;
}
private static HashMap<Character,Integer> getMap (String team){
HashMap<Character,Integer> map = new HashMap<Character, Integer>();
for(char c : team.toCharArray()){
map.put(c,map.getOrDefault(c,0)+1);
}
return map;
}
이렇게 하면 연두의 이름에서 계산한 map이 otherTeam의 map으로 완전히 덮어써집니다. 즉, L,O,V,E의 개수가 두 팀의 합산이 아닌 otherTeam만의 개수가 됩니다.
private static int getScore(String myTeam, String otherTeam){
HashMap<Character,Integer> map = getMap(myTeam,otherTeam);
// LOVE 각 문자의 개수 계산
int L = map.getOrDefault('L', 0);
int O = map.getOrDefault('O', 0);
int V = map.getOrDefault('V', 0);
int E = map.getOrDefault('E', 0);
// 공식 계산: ((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100
return ((L+O) * (L+V) * (L+E) * (O+V) * (O+E) * (V+E)) % 100;
}
private static HashMap<Character,Integer> getMap(String myTeam, String otherTeam){
HashMap<Character,Integer> map = new HashMap<>();
// 연두 팀의 문자 개수 계산
for(char c : myTeam.toCharArray()){
map.put(c,map.getOrDefault(c,0)+1);
}
// 다른 팀의 문자 개수 추가
for(char c : otherTeam.toCharArray()){
map.put(c,map.getOrDefault(c,0)+1);
}
return map;
}
따라서 위와 같이 연두의 팀과 다른 팀의 문자 개수를 구하는 반복문을 빼줬습니다.
'Coding Test > 백준' 카테고리의 다른 글
[백준, 10815번] 숫자 카드 (정렬, 이진 탐색, Java) (0) | 2024.11.19 |
---|---|
[백준, 11050번] 이항 계수 1 (수학, 구현, 조합론, Java) (1) | 2024.11.18 |
[백준, 1233번] 주사위 (브루트 포스, 구현, Java) (2) | 2024.11.16 |
[백준, 1173번] 운동 (구현, 시뮬레이션, Java) (1) | 2024.11.15 |
[백준, 16916번] 부분 문자열 (KMP, Java) (1) | 2024.11.14 |