728x90

문제


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

 

6996번: 애너그램

첫째 줄에 테스트 케이스의 개수(<100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 100을 넘지 않는 단어가 공백으로 구분되어서 주어진다. 단어는 알파벳 소문자로만 이루어

www.acmicpc.net

 

코드


const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\r\n');

//input[0] = '3'
//input[1] = 'blather reblath'
//input[2] = 'maryland landam'
//input[3] = 'bizarre brazier'

let anagrams = [];
let anagram = [];
const len = parseInt(input[0]); //3

for (let i=1; i<=len; i++) { //input의 index가 1~3이기 때문에 1부터 시작
    anagrams.push(input[i].split(" ")); //배열화 시키기
}
//anagrams = [['blather', 'reblath'], ['maryland', 'landam'], ['bizarre', 'brazier']]

for (let j=0; j<anagrams.length; j++) {
    for (k=0; k<anagrams[j].length; k++) {
        anagram.push(anagrams[j][k].split("").sort().join("")); //문자열 오름차순으로 정렬
    }
}
//anagram = ['abehlrt', 'abehlrt', 'aadlmnry', 'aadlmn', 'abeirrz', 'abeirrz']

let m = 0;
for (let l=0; l<anagram.length; l+=2) {
    if (anagram[l] === anagram[l+1]) { // [0,1], [2,3], [4,5] << 이 index대로 각각 비교하여 일치하면 anagram
        console.log(`${anagrams[m][0]} & ${anagrams[m][1]} are anagrams.`); //출력할때는 원본을 출력해야 하니 anagrams배열에서 가져오기
        m++;
    }
    else {
        console.log(`${anagrams[m][0]} & ${anagrams[m][1]} are NOT anagrams.`);
        m++;
    }
}

// 결과
// blather & reblath are anagrams.
// maryland & landam are NOT anagrams.
// bizarre & brazier are anagrams.

 

후기


  • 문제를 보자마자 각 문자열을 정렬해서 일치하면 anagram 으로 판단해야겠다는 생각을 하였다
  • 내 풀이보다 for문을 더 줄이고 코드를 더 간결하게 하고 싶었으나 배열 이해 부족인지 문자열 이해 부족인지 쉽지 않았다
  • 다른 분들의 풀이를 보니 map을 이용해서 많이들 풀이하셨다! 마지막 출력하는 for문에서는 삼항연산자를 이용하면 더 간결해질 것 같다는 생각이 든다

+ Recent posts