티스토리 뷰
[HackerRank] String Manipulation - (Easy)Strings: Making Anagrams (애너그램 만들기) javascript 문제 풀이
miiingo 2021. 6. 24. 09:12■ 문제
Strings: Making Anagrams | HackerRank
How many characters should one delete to make two given strings anagrams of each other?
www.hackerrank.com
난이도: Easy
최대 스코어: 25
● 문제 요약
- 첫 번째 문자열의 문자를 재배열하여 두 번째 문자열을 형성할 수 있는 경우 두 문자열은 서로의 애너그램이라고 함
- 첫 번째 문자열: a, 두 번째 문자열: b
- a와 b의 길이는 다를 수도 있음
- a와 b가 서로 애너그램이 되기 위해 a, b에서 제거해야하는 문자의 최소 숫자를 return
예시:
a = 'cde'
b = 'dcf'
- a에서 'e'를 제거 --> a = 'cd'
- b에서 'f'를 제거 --> b = 'dc'
==> return 2
■ 문제 풀이
이 문제는 각 알파벳 문자가 나온 숫자를 카운트해서 비교해 해결했다.
a와 b의 문자열은 모두 [a-z]의 문자로만 이루어져있기 때문에, [a-z] 문자가 나온 횟수를 저장할 counter 배열을 생성하고 모두 0으로 초기화 시켜준다. ([a-z]는 총 26개의 문자이기 때문에 counter의 length도 26!)
그런 다음, 문자열 a에서 각 문자가 나온 횟수를 counter 배열에 추가한다.
같은 방법으로 문자열 b에서 각 문자가 나온 횟수를 counter 배열에 추가하는데, 이 때 문자열 a와의 비교를 위해 해당 문자의 카운터 값을 마이너스 시켜준다.
그러고 나면 counter 배열에 남은 값들은 a에만 있거나, b에만 있는 문자들의 개수가 된다.
이 문자들을 모두 삭제하면 a와 b는 서로 애너그램이 되는 것이다.
이제 counter 배열에 있는 값들을 모두 더해주면 제거해야하는 최소 문자 수가 되는데, 문자열 b에 나온 문자들은 카운터 값을 마이너스(-) 해줬기 때문에 counter[]의 절대값을 더해주면 된다.
● 완성 코드 - 25 Points (Max)
'use strict';
const fs = require('fs');
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let inputString = '';
let currentLine = 0;
process.stdin.on('data', function(inputStdin) {
inputString += inputStdin;
});
process.stdin.on('end', function() {
inputString = inputString.split('\n');
main();
});
function readLine() {
return inputString[currentLine++];
}
/*
* Complete the 'makeAnagram' function below.
*
* The function is expected to return an INTEGER.
* The function accepts following parameters:
* 1. STRING a
* 2. STRING b
*/
function makeAnagram(a, b) {
// Write your code here
let counter = [];
for(let i=0; i<26; i++){
counter[i] = 0;
}
for(let i=0; i<a.length; i++){
counter[a.charCodeAt(i)-97]++;
}
for(let i=0; i<b.length; i++){
counter[b.charCodeAt(i)-97]--;
}
return counter.reduce((acc, cur, idx) => {
if(counter[idx] != 0){
acc += Math.abs(counter[idx]);
}
return acc;
}, 0)
}
function main() {
const ws = fs.createWriteStream(process.env.OUTPUT_PATH);
const a = readLine();
const b = readLine();
const res = makeAnagram(a, b);
ws.write(res + '\n');
ws.end();
}
■ 결론
각 문자가 나온 횟수를 카운트해서 비교하는 것이 핵심인 것 같다!
'알고리즘 > HackerRank' 카테고리의 다른 글
- Total
- Today
- Yesterday
- Blockchain
- 직딩잇템
- 하이퍼레저 페브릭
- 기초 of 기초 데이터 개념
- Hyperledger Fabric
- 빅데이터
- javascript
- 암브로셔스
- Private Data
- 코테
- 빅데이터 기초
- ambrosus
- docker
- 블록 체인
- 하이퍼레저 인디
- 하이퍼레저 패브릭
- 알고리즘
- 어서와 데이터는 처음이지
- 빅데이터 교육
- ubuntu
- 빅데이터 강의
- codility
- 코딩테스트
- 블록체인
- 코딜리티
- Hyperledger Indy
- Hyperledger Fabric v1.1
- Hyperledger Fabric v1.2
- 문제풀이
- DOCs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |