백준 / 1296번 / 팀 이름 정하기
[문제]
연두는 프로그래밍 대회에 나갈 팀 이름을 정하려고 한다. 미신을 믿는 연두는 이환이에게 공식을 하나 받아왔고, 이 공식을 이용해 우승할 확률이 가장 높은 팀 이름을 찾으려고 한다.
이환이가 만든 공식은 사용하려면 먼저 다음 4가지 변수의 값을 계산해야 한다.
- L = 연두의 이름과 팀 이름에서 등장하는 L의 개수
- O = 연두의 이름과 팀 이름에서 등장하는 O의 개수
- V = 연두의 이름과 팀 이름에서 등장하는 V의 개수
- E = 연두의 이름과 팀 이름에서 등장하는 E의 개수
그 다음, 위에서 구한 변수를 다음 식에 입력하면 팀 이름의 우승할 확률을 구할 수 있다.
((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100
연두의 영어 이름과 팀 이름 후보 N개가 주어졌을 때, 우승할 확률이 가장 높은 팀 이름을 구해보자. 확률이 가장 높은 팀이 여러가지인 경우 사전 순으로 가장 앞서는 팀 이름이 우승할 확률이 가장 높은 것이다.
[입력]
첫째 줄에 연두의 영어 이름이 주어진다. 둘째 줄에는 팀 이름 후보의 개수 N이 주어진다. 셋째 줄부터 N개의 줄에 팀 이름이 한 줄에 하나씩 주어진다.
연두의 영어 이름과 팀 이름은 길이는 1보다 크거나 같고, 20보다 작거나 같으며, 알파벳 대문자로만 이루어져 있다. N은 50보다 작거나 같은 자연수이다.
[출력]
첫째 줄에 우승할 확률이 가장 높은 팀 이름을 출력한다.
[예제 입력]
LOVE
3
JACOB
FRANK
DANO
[예제 출력]
FRANK
[예제 입력]
JANE
4
THOMAS
MICHAEL
INDY
LIU
[예제 출력]
INDY
우선, 연두의 이름에 LOVE 각 알파벳이 몇개가 있는지 구해야하고,
그 후 각 팀에서는 몇 개가 있는 지 구해야 한다.
이 값을 더한 후 우승확률을 계산하고,
우승확률이 높은 팀을 출력하면 되는데 이 때 주의해야 할 점이 우승확률이 같은 경우 사전순으로 앞에 오는 팀의 이름을 출력해줘야 한다는 것이다.
처음 코드를 작성할 땐 for문을 돌면서 하나하나 알파벳 개수를 세줬는데,
문자열에서 특정 문자를 지우는 replace 함수를 사용하면 편하다는 걸 알게됐다!
replace("L", "") => L을 ""로 대체하므로,
기존 이름의 길이에서 L을 제거하고 남은 길이를 빼주면 이름에 있던 L의 개수를 알 수 있다!
또한, 문자열을 사전 순서로 값을 비교를 위해 compareTo 메소드를 사용한다.
System.out.println(str1.compareTo(str2));
위와 같이 사용하는 경우,
str1이 str2보다 사전순으로 앞서있는 경우 음수를 반환하고, 뒤에 있으면 양수가, 동일하다면 0이 반환된다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String name = sc.next(); // 연두 이름
int yL = name.length() - name.replace("L", "").length();
int yO = name.length() - name.replace("O", "").length();
int yV = name.length() - name.replace("V", "").length();
int yE = name.length() - name.replace("E", "").length();
int N = sc.nextInt(); // 팀 이름 후보 개수
int max = -1;
String winTeam = ""; // 이긴 팀 이름
for (int i = 0; i < N; i++) {
String team = sc.next();
int cntL = yL + team.length() - team.replace("L", "").length();
int cntO = yO + team.length() - team.replace("O", "").length();
int cntV = yV + team.length() - team.replace("V", "").length();
int cntE = yE + team.length() - team.replace("E", "").length();
int total = ((cntL + cntO) * (cntL + cntV) * (cntL + cntE) * (cntO + cntV) * (cntO + cntE) * (cntV + cntE))
% 100;
if (max < total) {
max = total;
winTeam = team;
}
else if (max == total) {
if (winTeam.compareTo(team) > 0) {
winTeam = team;
}
}
}
System.out.println(winTeam);
}
}