문제
The goal of this exercise is to convert a string to a new string where each character in the new string is "(" if that character appears only once in the original string, or ")" if that character appears more than once in the original string. Ignore capitalization when determining if a character is a duplicate.
문제해석 : 주어진 문자열에서 각각의 문자가 같은 문자가 1개 나오면 '(', 2개이상 나오면 ')'로 치환하여 새로운 문자열을 만들어라. 대소문자 구분없이 비교하시오.
문제접근
- 첫번째 생각 : 그냥 이중for문을 돌려서 각각의 문자를 확인하면 되지않을까?
String.charAt()을 사용하여 구현 할 수 있다.
두번째 생각 : 다른 String 혹은 Array 관련 method를 사용하는 좀 더 효율적인 방법이 존재하지 않을까?
ex) String.includes(), String.indexOf()
- 결국 첫번째 생각대로 풀이하였다.
나의 코드
function duplicateEncode(word){
let newString = '';
word = word.toLowerCase();
for(let i = 0; i <word.length; i++){
let cnt = 1;
for(let j = 0; j < word.length; j++){
if(i !== j && word.charAt(i) === word.charAt(j)) cnt++;
}
if(cnt > 1) newString += ')';
else newString += '(';
}
return newString;
}
best solution & clever solution
codewars에는 best solution 과 clever solution, 이 2가지 부분을 선정하고 있었다. 그런데 이 문제는 같은 풀이가 두 부문에서 1위를 차지하였다.
function duplicateEncode(word){
return word
.toLowerCase()
.split('')
.map( function (a, i, w) {
return w.indexOf(a) == w.lastIndexOf(a) ? '(' : ')'
})
.join('');
}
📌 처음으로 내가 푼 문제에 대해서 정리를 해본다. 지금까지 적지 않은 문제를 풀었음에도 한 번도 따로 정리를 해본 적이 없었다. TIL을 하게 되면서 이렇게 하루에 1문제씩 쉬운 문제든 어려운 문제든(아마도 점차 난이도가 올라갈 듯) 꾸준히 나름의 배움을 정리해 볼 것이다. 또한 백준이나 프로그래머스, 코드업에서 주로 뒹굴었는데, 이번엔 영어 사이트인 codewars에서 뒹굴 예정이다. 영어와도 친해지는 좋은(?) 계기가 되길 바란다.