suheang

[백준] | JAVA, 자바 | 1296번 - 팀 이름 정하기 본문

알고리즘

[백준] | JAVA, 자바 | 1296번 - 팀 이름 정하기

suheang 2024. 8. 16. 21:51

https://www.acmicpc.net/problem/1296


문제 요약 :

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

이환이가 만든 공식은 사용하려면 먼저 다음 4가지 변수의 값을 계산해야 한다.

  • L = 연두의 이름과 팀 이름에서 등장하는 L의 개수
  • O = 연두의 이름과 팀 이름에서 등장하는 O의 개수
  • V = 연두의 이름과 팀 이름에서 등장하는 V의 개수
  • E = 연두의 이름과 팀 이름에서 등장하는 E의 개수

그 다음, 위에서 구한 변수를 다음 식에 입력하면 팀 이름의 우승할 확률을 구할 수 있다.

((L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)) mod 100

확률이 가장 높은 팀이 여러가지인 경우 사전 순으로 가장 앞서는 팀 이름이 우승할 확률이 가장 높은 것이다.

 

( 첫째 줄에 우승할 확률이 가장 높은 팀 이름을 출력 )


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int l = 0, o = 0, v = 0, e = 0;
        String yeondu = br.readLine();
        int n = Integer.parseInt(br.readLine());
        int[] win = new int[n];

        for (int i = 0; i < yeondu.length(); i++) {
            char c = yeondu.charAt(i);
            if (c == 'L') l++;
            if (c == 'O') o++;
            if (c == 'V') v++;
            if (c == 'E') e++;
        }

        int max = Integer.MIN_VALUE;
        String winTeam = null;

        for (int i = 0; i < n; i++) {
            int sum = 0;
            int yeonduL = l;
            int yeonduO = o;
            int yeonduV = v;
            int yeonduE = e;
            String team = br.readLine();
            for (int j = 0; j < team.length(); j++) {
                char c = team.charAt(j);
                if (c == 'L') l++;
                if (c == 'O') o++;
                if (c == 'V') v++;
                if (c == 'E') e++;
            }
            sum = ((l + o) * (l + v) * (l + e) * (o + v) * (o + e) * (v + e)) % 100;
            if (sum > max || (sum == max && (winTeam == null || team.compareTo(winTeam) < 0))) {
                max = sum;
                winTeam = team;
            }
            l = yeonduL;
            o = yeonduO;
            v = yeonduV;
            e = yeonduE;
        }

        System.out.println(winTeam);
    }
}

 

1. 연두의 이름과 팀 이름에 등장하는 알파벳 개수를 저장하기 위한 변수 l, o, v, e 생성

2. 연두 이름 입력받기

3. 팀 이름 후보 n  입력받고 n의 크기를 가진 배열 win 생성

4. 연두의 이름에 l, o, v, e가 각각 몇 개씩 들어갔는지 확인하고 변수에 개수 저장

5. 가장 높은 우승 확률을 저장할 변수 max, 우승할 확률이 가장 높은 팀 이름을 저장할 변수 winTeam 생성
6. for 문을 사용해 팀 우승 확률을 저장할 변수 sum, 연두의 l, o, v, e 값을 저장할 변수 ueonduL, O, V, E 생성
7. 팀 이름에 l, o, v, e가 각각 몇 개씩 들어갔는지 확인하고 변수에 개수를 추가
8. 우승 확률 계산식으로 계산한 값을 sum에 저장

9. sum이 max보다 값이 크거나 sum과 max의 값이 같고 현재 팀 이름이 winTeam에 저장된 단어보다 사전 순으로 더 앞선다면 max는 sum 값으로 변경하고 winTeam에 해당 팀 이름을 저장

10. 팀 이름에 l, o, v, e가 저장된 개수를 연두 이름에 있었던 개수로 다시 초기화

11. 저장된 winTeam 출력