[BOJ 1339] 단어 수학 - node.js

베르·2022년 11월 14일
0

Algorithm

목록 보기
1/1

1️⃣ 문제 설명

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

2️⃣ 풀이

알파벳을 숫자로 치환해서 더했을 때 값이 가장 큰 경우의 최댓값을 출력해주면 된다
처음엔 각각 문자에 숫자를 미리 넣어주면서 파싱을 해주고 경우의 수를 구해서 가장 큰 경우를 출력하는 식으로 접근했는데 너무 복잡하기도 하고 아닌 것 같아 방향을 바꿔봤다
핵심은 A를 9로 치환하고 B를 8로 치환하고가 아닌, 계산된 결과의 최댓값을 구한다는 것이다

  1. 먼저 빈 객체를 만들어 준다.
  2. 이 객체에는 각 문자를 숫자로 치환하지 않은 자릿값만을 더해준다

예제에 있는 ACDEB + GCF를 자릿값만 가지고 계산해보면 다음과 같은 결과가 나온다

{
    A: 10000,
    B: 1,
    C: 1000 + 10,
    D: 100,
    E: 10,
    F: 1,
    G: 100,
}

이를 풀어보면 다음과 같이 나타낼 수 있다

10000A + 1B + 1010C + 100D + 10E + 1F + 100G 
  1. 이렇게 되면 위에서도 언급했듯이 A와 B에 어떤 숫자가 들어가야 하는지 보다는, 해당 숫자를 내림 차순으로 정렬하고 가장 큰 수부터 해당 숫자에 곱해주고 이를 더한 값을 출력하면 된다.
(10000 * 9) + (1010 * 8) + (100 * 7) + (100 * 6) + (10 * 5) + (1 * 4) + (1 * 3)

3️⃣ 나의 코드

const input = require("fs").readFileSync("./dev/stdin").toString().trim().split("\n");
const N = +input[0];
const words = input.slice(1).map((word) => word.split(""));
const nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

//1.
const obj = {};

//2.
words.forEach((word) => {
	word.reverse().forEach((char, idx) => {
		if (!obj[char]) obj[char] = 0;
		obj[char] += 10 ** idx;
	});
});

let answer = 0;

//3.
Object.values(obj)
	.sort((a, b) => b - a)
	.forEach((v) => (answer += v * nums.pop()));

console.log(answer);

0개의 댓글