베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 1339번: 단어 수학

2023. 4. 3. 18:04
1339번: 단어 수학
https://www.acmicpc.net/problem/1339

키워드

단어 수학 문제는 N개의 단어로 이루어져 있으며, 각 단어는 알파벳 대문자로만 이루어져 있다.

각 알파벳 대문자를 0부터 9까지의 숫자 중 하나로 바꿔서 N개의 수를 합하는 문제

두 개 이상의 알파벳이 같은 숫자로 바뀌어지면 안 된다.

N개의 단어가 주어졌을 때, 그 수의 합을 최대로 만드는 프로그램


구현

  • 각 자릿수의 가중치만큼을 계산해서 더해준다.
  • N개의 단어라고해서 알파벳 A부터 Z까지의 알파벳을 전부 사용하는 것이 아니다.

    두 개 이상의 알파벳이 같은 숫자로 바뀌면 안되므로 입력에서 10종류 이하의 알파벳 단어만 주어질 것이다.

    → Map을 이용하여 사용된 알파벳의 Key, 알파벳 가중치 Value를 저장한다.

  • 각 자릿수의 가중치를 저장한 Map에서 Value의 내림차순으로 9에서 0까지 배치한다.

    배치와 동시에 가중치와 곱하여 결과에 더해준다.

Map을 Value기준으로 정렬하는 방법

Map.entrySet() 메서드를 이용한다.

해당 메서드를 이용하면 Entry객체의 List형식으로 반환이 된다.

이 때 Entry.comparingByValue() 메서드를 이용하여 값을 통한 정렬을 수행한다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class java_1399 {
    static int N;

    // 각 알파벳 대문자를 0~9까지 숫자중 하나로 바꿔서 합
    // 두 개 이상이 같은 숫자 X

    static StringBuffer words[];

    public static void main(String[] args) throws IOException {
        // GCF + ACDEB

        // 각 자릿수만큼 가중치를 두어 맵에 저장한다.
        // 맵에 값에서 가장 큰것부터 큰 값을 할당한다.
        // ex] ABBBB A:10000 B:3000
        // A가 9가 되는 것이 이득이다.
        // 최대값 100_000_000

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());

        words = new StringBuffer[N];

        for (int i = 0; i < N; i++) {
            words[i] = new StringBuffer(br.readLine()).reverse();
        }

        int result = solution();

        System.out.println(result);

        br.close();
    }

    private static int solution() {
        Map<Character, Integer> alphaMap = new HashMap<>();

        for (StringBuffer word : words) {
            // 현재 단어를 더해주기
            int exp = 1;
            for (int i = 0; i < word.length(); i++) {
                // 현재 알파벳 추출
                char thisAlpha = word.charAt(i);

                // 자릿수에 따른 가중치 값 가산
                int alphaValue = alphaMap.getOrDefault(thisAlpha, 0);
                alphaMap.put(thisAlpha, alphaValue + exp);

                // 자릿수 증가
                exp *= 10;
            }
        }

        List<Entry<Character, Integer>> entryList = new ArrayList<Entry<Character, Integer>>(alphaMap.entrySet());

        // value 의 내림차순 정렬
        entryList.sort(Entry.comparingByValue((o1, o2) -> o2 - o1));

        int result = 0;
        int number = 9;
        for (Entry<Character, Integer> entry : entryList) {
            result += entry.getValue() * number;
            number--;
            // System.out.println(entryList);
        }

        return result;
    }
}


Uploaded by N2T

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 16958번: 텔레포트  (0) 2023.04.03
[BOJ/JAVA] 23559번: 밥  (0) 2023.04.03
[BOJ/JAVA] 27313번: 효율적인 애니메이션 감상  (0) 2023.04.03
[BOJ/JAVA] 1744번: 수 묶기  (0) 2023.04.03
[BOJ/JAVA] 1198번: 삼각형으로 자르기  (0) 2023.04.03
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 16958번: 텔레포트
    • [BOJ/JAVA] 23559번: 밥
    • [BOJ/JAVA] 27313번: 효율적인 애니메이션 감상
    • [BOJ/JAVA] 1744번: 수 묶기
    베오
    베오

    티스토리툴바