Algorithm/Baekjoon

백준 / 1296번 / 팀 이름 정하기

Gyuri 2023. 1. 17. 20:19

[문제]

연두는 프로그래밍 대회에 나갈 팀 이름을 정하려고 한다. 미신을 믿는 연두는 이환이에게 공식을 하나 받아왔고, 이 공식을 이용해 우승할 확률이 가장 높은 팀 이름을 찾으려고 한다.

이환이가 만든 공식은 사용하려면 먼저 다음 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);
    }
}