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 메서드를 사용하여 문자열 비교).
 

[JAVA] HashMap 이란 ❓ (1/2)

Java에서 데이터를 효율적으로 저장하고 빠르게 검색하기 위해 다양한 컬렉션 클래스가 제공됩니다. 그중에서도 HashMap은 키-값 쌍을 저장하고 관리하는 데 있어 매우 유용한 데이터 구조

pixx.tistory.com

 

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;
    }

 

이렇게 하면 연두의 이름에서 계산한 mapotherTeammap으로 완전히 덮어써집니다. 즉, 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;
    }

 

따라서 위와 같이 연두의 팀과 다른 팀의 문자 개수를 구하는 반복문을 빼줬습니다.