애너그램 만들기

문제

언어

  • JavaScript

순서도

  1. 첫 번째 단어에서 a ~ z 까지 각각 몇 개 있는지 세기
  2. 두 번째 단어에서 a ~ z 까지 각각 몇 개 있는지 세기
  3. 첫 번째 단어와 두 번쨰 단어의 각각의 문자가 총 몇 개 차이나는지 세기

문제 풀이 step 1

  • 애너그램 관계란,
    • 두 영어 단어의 철자의 순서를 뒤바꾸어 같아질 수 있는 경우, 두 단어는 애너그램 관계에 있다고 합니다.
    • occurs 와 succor
    • ared 와 read
  • 두 개의 영어 단어가 주어졌을 때, 두 단어가 서로 애너그램 관계에 있도록 만들기 위해서 제거해야 하는 최소 개수의 문자 수를 구하는 문제입니다.

문제 풀이 step 2

  • 애너그램 관계가 되려면 두 영어 단어의 각 철자의 개수가 서로 동일해야 합니다.
  • 그렇다면, 각각 단어에서 각 철자의 개수를 세고, 서로 차이가 나는 철자만큼 제거하면 애너그램 관계가 될 것입니다.
  • 따라서 첫 번째 단어와 두 번째 단어 각각 a ~ z 까지 각 철자가 몇 개씩 있는지 세어줍니다.
  • 그리고 첫 번째 단어와 두 번째 단어 각각 a ~ z 까지 각 철자의 차이가 몇개 있는지 세어주고 다 더해주면 정답입니다.
  • 추가 설명은 주석으로 작성하겠습니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	// a ~ z 까지 개수를 세기 위한 배열
	const a = Array(26).fill(0);
	const b = Array(26).fill(0);

	// 첫 번째 단어 각 철자의 개수 세기
	for (let ch of input[0].split("")) {
		const index = ch.charCodeAt(0) - "a".charCodeAt(0);
		a[index] += 1;
	}

	// 두 번째 단어 각 철자의 개수 세기
	for (let ch of input[1].split("")) {
		const index = ch.charCodeAt(0) - "a".charCodeAt(0);
		b[index] += 1;
	}

	// 두 단어의 각 철자의 개수 차이 세기
	let ans = 0;
	for (let i = 0; i < 26; i++) {
		ans += Math.abs(a[i] - b[i]);
	}

	return ans;
};

console.log(solution(input));