문제
문제 설명
거울 단어는 단어의 오른쪽에 거울을 두고 단어를 비춰봤을 때, 거울 속에 비친 단어가 원래 단어와 똑같은 단어를 의미합니다. 한 알파벳을 거울에 비춰봤을 때 어떤 알파벳으로 보이는지 표로 정리하면 아래 사진과 같습니다. 표에 없는 알파벳은 거울에 비춰봤을 때 쌍을 이루는 알파벳이 없음을 의미합니다.
거울 단어의 예시를 들자면 poq나 bidbid와 같은 단어가 해당됩니다. 반면 level이나 dpb와 같은 단어는 level의 경우 e에 대응되는 다른 알파벳이 없기 때문에 거울 단어가 아니고, dpb는 거울로 비췄을 때 dqb로 보이기 때문에 거울 단어가 될 수 없습니다.
알파벳 소문자로만 이루어진 N개의 단어가 주어질 때, 각 단어가 거울 단어인지 아닌지 판별하는 프로그램을 작성하면 되는 문제입니다.
더보기
※주의사항
- 첫째 줄에는 단어의 개수를 의마하는 정수 N이 주어집니다.
- 다음 N개의 줄에는 단어가 한 줄에 하나씩 주어집니다.
- 1 <= N <= 1,000
- 각 단어의 길이는 1 이상 100 이하입니다.
- 주어지는 단어는 알파벳 소문자로만 이루어져 있습니다.
- 주어지는 단어가 거울 단어라면 Mirror, 거울 단어가 아니라면 Normal을 한 줄에 하나씩 출력합니다.
풀이
사용한 변수
- N : 단어의 개수를 저장하는 변수
- words : 문제에서 주어지는 N개의 단어를 저장하는 배열
- alpha : 각 알파벳에 해당하는 거울 단어를 저장하는 객체 (예시 : {'b' : 'd'})
- first : 거울 단어임을 확인하기 위해서는 앞 부분과 뒷 부분을 비교할 필요가 있기 때문에, 단어 길이의 절반에 해당하는 앞 부분을 저장합니다.
- last : 거울 단어를 찾기 위해 단어 길이의 절반에 해당하는 뒷 부분을 저장합니다.
- middle : 정가운데 글자가 거울 단어인지 확인하기 위해 사용한 변수
- chekc : 거울 단어를 판단하 bool형 변수
구현과정
먼저 거울 단어에는 어떤 종류가 있는지 확인할 수 있도록 거울 단어들을 저장하는 객체 alpha를 생성해주었습니다.
let alpha = {'b' : 'd', 'i' : 'i', 'm' : 'm', 'n' : 'n', 'o' : 'o', 'p' : 'q', 'u' : 'u', 's' : 'z', 'v': 'v', 'w' : 'w', 'x' : 'x', 'l' : 'l'}
생성해준 다음 words의 모든 요소를 돌면서 거울 단어를 찾는 과정을 가졌습니다. 찾는 과정은 다음과 같습니다.
- first라는 변수를 선언하여 word.length/2에 해당하는 부분까지 잘자서 저장해줍니다.
- last라는 변수를 선언혀여 first에 저장하고 남은 부분을 저장해줍니다.
- first.length와 last.length가 같지않다면 가운데 글자를 비교하는 과정이 필요하므로
- middle이라는 변수를 선언하여 가운데에 해당하는 word[Math.floor(word.length/2)]를 저장해줍니다.
- middle이 거울 변수인지 확인해줍니다.( if(alpha[middle] !== middle ) )
- 거울 변수가 아니라면 check값을 false로 바꿔줍니다.
- 다음 과정으로 first에 있는 모든 요소를 검사해줍니다.
- first에 있는 모든 글자와 last에 있는 모든 글자를 하나씩 비교하여 거울 단어인지 아닌지 확인하는 과정을 가집니다.
- 단어 하나가 확인될 때마다 거울 단어이면(check===true) "Mirror"를 아니면(check===false) "Normal"를 출력해줍니다.
아래는 풀이에 사용한 전체 코드입니다.
const readline = require('readline');
(async () => {
let rl = readline.createInterface({ input: process.stdin });
// 단어의 개수
let N = 0;
// N개만큼의 단어 저장
let words = [];
rl.on("line", function(line) {
if(N === 0) N = Number(line)
else words.push(line)
}).on("close", function() {
solution(N, words)
})
})();
function solution(N, words) {
// 거울 단어의 종류를 저장하는 객체
let alpha = {'b' : 'd', 'i' : 'i', 'm' : 'm', 'n' : 'n', 'o' : 'o', 'p' : 'q', 'u' : 'u', 's' : 'z', 'v': 'v', 'w' : 'w', 'x' : 'x', 'l' : 'l'}
// words에 있는 모든 요소를 확인합니다.
words.map((word,idx) => {
// word의 1/2에 해당하는 앞 부분을 저장해줍니다.
const first = word.substr(0, Math.floor(word.length/2))
// first에 저장하고 남은 부분을 저장해줍니다.
const last = word.substr(Math.floor(word.length/2),word.length)
// 거울 단어를 판별하는 변수
let check = true
// first와 last의 길이가 다르다면 중앙값을 검사해줍니다.
if(first.length !== last.length) {
// 중앙값을 저장하는 변수
const middle = word[Math.floor(word.length/2)]
// 거울 단어가 아니라면 false
if(alpha[middle] !== middle )check = false
}
// first의 모든 ch를 확인합니다.
for(const i in first) {
const ch = first[i]
// first의 앞 부분과 last의 뒷 부분을 비교하여 거울 단어인지 판별합니다.
if(alpha[ch] !== undefined){
if(alpha[ch] !== last[last.length-i-1]) check = false
}else if(getKeyByValue(alpha, first[i]) !== ''){
// getKeyByValue함수로 alpha에 존재하는 거울 단어인지 확인합니다.
// 존재하면 last값과 비교하여 거울 단어인지 확인합니다.
if(getKeyByValue(alpha, first[i]) !== last[last.length-i-1]) check = false
}else {
// 모두 아니라면 거울 단어가 아니므로 check=false로 바꿔줍니다.
check = false
}
}
// 거울 단어인지 그냥 단어인지 출력해줍니다.
if(check === false) console.log("Normal")
else console.log("Mirror")
})
}
// 문제에 주어진 거울 단어인지 확인하는 함수
function getKeyByValue(obj, value) {
const ch = Object.keys(obj).find(key => obj[key] === value);
if(ch === undefined) return ''
return ch
}
'코딩테스트 > 구름' 카테고리의 다른 글
[구름 Level] Lv.02 해외주식투자 (JavaScript) (0) | 2024.06.21 |
---|