문제
풀이
브루트 포스 문제지만, 억지로 브루트 포스를 적용해보려고 하다가 좀 헤맨 문제다.
모든 경우의 수를 조회할 수 있는 방법도 있지만,
각 단어를 구성하는 알파벳에 숫자를 대입한 합의 최대값을 출력하는 문제이기 때문에 다르게 접근해봤다.
단어에서 위치한 알파벳들의 자릿수 합을 계산하고, 자릿수의 합 순으로 정렬한다.
자릿수의 합이 큰 알파벳부터 순차적으로 가능한 가장 큰 숫자를 대입한다.
"AAA", "BCD"일 때
111A + 100B + 10C + D에서
A=9, B=8, C=7, D=6을 대입한 결과가 모든 숫자를 대입해 볼 필요 없이, 바로 최댓값이 된다.
간단한 그림 예시를 첨부한다.
다음과 같이 한번에 답을 구할 수 있다.
코드
const sol = (input) => {
const alphabetObj = {}; // 자릿수를 누적할 때 객체의 키:값 관계를 이용해보자.
input.slice(1).map((str) => {
let size = 1;
for (let i = str.length - 1; i >= 0; i--) {
const word = str[i];
if (alphabetObj[word]) alphabetObj[word] += size;
else alphabetObj[word] = size;
size *= 10;
} // 각 단어들에 대해 단어를 구성하는 알파벳들의 자릿수를 객체의 각 알파벳 키에 대응하는 값에 계속 더해준다.
});
const alphabetArr = Object.entries(alphabetObj).sort((a, b) => b[1] - a[1]);
// [키, 값]들의 배열로 바꿔 값에 따라 내림차순 정렬
let number = 9;
let sum = 0;
for (let i = 0; i < alphabetArr.length; i++) {
sum += alphabetArr[i][1] * number--;
} // 가장 큰 자릿수를 가진 알파벳부터 9부터 순차적으로 대입해주고, 합계를 구한다.
return sum;
};
// 백준에서 입력을 받는 코드
const input = [];
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
input.push(line);
})
.on("close", () => {
console.log(sol(input));
process.exit();
});
'DS & Algorithm > baekjoon' 카테고리의 다른 글
[백준] 14889 스타트와 링크 - JavaScript(NodeJS) (0) | 2021.06.04 |
---|---|
[백준] 14888번 연산자 끼워넣기 - JavaScript(NodeJS) (0) | 2021.06.04 |
[백준] 2529번 부등호 - JavaScript(NodeJS) (0) | 2021.06.04 |
[백준] 1967 트리의 지름 - JavaScript(NodeJS) (0) | 2021.06.03 |
[백준] 1167번 트리의 지름 - JavaScript(NodeJS) (0) | 2021.06.03 |