문제링크

문제

This time no story, no theory. The examples below show you how to write function accum:

Examples:

accum("abcd") -> "A-Bb-Ccc-Dddd"
accum("RqaEzty") -> "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
accum("cwAt") -> "C-Ww-Aaa-Tttt"

The parameter of accum is a string which includes only letters from a..z and A..Z.

🚩문제해석
parameter로 들어온 문자열을 1글자씩 변환시켜서 누적한 문자열을 반환하시오. 예시를 보면 명료하게 알 수 있다.

문제 접근

대문자에서 소문자 혹은 소문자에서 대문자로의 변환에 있어서 아스키코드값을 이용해서 많이 해왔다.
대문자 + 32 = 소문자, 소문자 - 32 = 대문자
이 문제 역시 그런 생각으로 접근했다. 또한 자바스크립트 같은 경우는 문자열을 배열로 바꿨을 때, 좀 편하게 문제를 풀 수 있는 것 같다.

1     function accum(s) {
2       return s.split('').map((ele,idx) => {  
3         if(ele.charCodeAt(0) >= 65 && ele.charCodeAt(0) <= 95) {//upperCase
4           return `${ele}${String.fromCharCode(ele.charCodeAt(0)+32).repeat(idx)}`;
5         }
6         else{ //lowerCase
7           return `${String.fromCharCode(ele.charCodeAt(0)-32)}${ele.repeat(idx)}`;
8         }
9       }).join('-');
10    }

string.charCodeAt(index) : 문자열의 해당 인덷스값의 문자를 UTF-16 코드를 나타내는 정수로 반환한다

String.fromCharCode(num1[, num....]) : UTF-16 코드를 나타내는 정수를 문자열을 생성해 반환한다. parameter로 여러 개의 정수가 들어갈 수 있다. 여러 개가 들어갈 경우, 해당 문자를 모두 리턴한다.

Best Solution

  function accum(s) {
    return s.split('')
              .map((c, i) => (c.toUpperCase() + c.toLowerCase().repeat(i)))
              .join('-');
  }

사실 이 풀이는 내가 접근한 방법과 완전히(?) 같다고 생각한다. 단, 내 풀이의 3~8번 라인이 toUpperCase()와 toLowerCase()로 바뀌었다. 이 풀이를 보고 몇 초동안 약간 멍했다. '저런 메소드가 있었나?' 하는 생각이 들었다. 단순하게 대문자에서 소문자, 소문자에서 대문자로 바꿀 때는 아스키코드로 접근할 필요없이 메소드를 선택하는 편이 좋다. 내가 아스키코드를 생각한 것은 자바에서 문자와 숫자의 변환할 때의 익숙함 때문이였던 것 같다. 그리고 문자 간의 연산일 때 string.charCodeAt(index) 와 String.fromCharCode(num1[, num....]) 이 두가지 메소드를 사용하는 것 같다. 이에 해당하는 문제는 예전에 포스팅했던 문제가 있다.( 참고 Alphabetical Addition<7 kyu>)

결론

어떠한 문제를 접근 할 때, 익숙한 생각들이 있다. 그래서 그렇게만 풀려는 경향이 생기곤한다. 어쨌든 문제는 풀리니까, 답은 나왔으니 거기에 만족하고 넘어가곤했다. 이 문제도 만약에 뭔가 다른방법은 없을까에 대해 생각해보지않았다면 그냥 저렇게 긴 코드를 가진채 넘어갔을 것이다. 시간이 걸리더라고 남의 코드를 보고 느끼고 깨닫고 하는 과정의 반복이 필요할 것이다, 아무리 쉽더라도 말이다. 이것은 비단 여기서 끝나는 것이 아니라 생각한다. 내가 개발자로서 살아가기 위한 태도랄까. 새로운 것, 모르는 것들에 대해 받아들이려는 것, 이것은 내가 죽을 때까지, 진짜 개발자가 되고 싶다면 가져야할 태도라 생각한다. 그런데 이렇게 쉬운 문제를 풀고 너무 의미부여를 한듯하다...😅

🚀 문제를 풀어나갈 때 생각의 흐름을 정리합니다. 또한 새로운 풀이에 대한 코드를 분석하고 모르는 부분에 대해서 정리합니다. 생각이 다른 부분에 대한 피드백은 언제나 환영합니다. 틀린 내용에 대한 피드백 또한 항상 감사합니다.