본문 바로가기
자기개발/TIL

A강조하기에는 a도 A도 A가 나와야 한다

by 금화맘 2023. 7. 20.

오늘도 프로그래머스에서 문제를 풀었다.

myString라는 문자열을 받으면 여기서 a를 A로 만들고 a가 아닌 글자들은 전부 소문자로 바꾸라는 거였다.

 

그래서 문제를 풀고 처음에는 이번에도 reg를 써서 해야겠다라고 생각해서 

let reg = /a/gi를 적어놓고서

코드를 작성하려고 하니 대문자로 바꾸는 것 뿐만 아니라 a가 아닌 대문자는 소문자로 바꿔야 하는 것도 있었다.

사실 아직 . 으로 연결하는 걸 잘 못하는 지라 일단 계속 해 왔던 reduce로 했다. 문자열을 하나의 문자열로 다시 만드는 건 reduce가 편하다고 생각해서 reduce로 하게 됐다.

function solution(myString) {
    var answer = [...myString].reduce((acc,c)=> c === 'a'? acc + c.toUpperCase() : acc + c.toLowerCase(),'');
    return answer;
}

이렇게 코드를 만들었을 때 테스트를 했을 때는 성공했다. 근데 막상 제출하니 반려됐다.

도대체 이핵 안돼서 뭐가 문제일까 하다가 검색을 해봤다.

그랬더니 내 코드의 문제가 a를 A로 만드는 것까진 잘 하는데 a가 아님 나머지는 다 소문자로 만들었다.

그런데 프로그래머스의 문제는 결과에 a란 없고 A만 있어야 하는 거였다.

function solution(myString) {
    // var reg = /a/gi
    var answer = [...myString].reduce((acc,c)=> c === 'a'||c==="A" ? acc + c.toUpperCase() : acc + c.toLowerCase(),'');
    return answer;
}

그래서 이렇게 코드에 "A"를 추가하고나니 통과했다.

문제에 ""A"가 아닌 모든 대문자 알파벳은 소문자 알파벳으로 변환"가 있다는 걸 제대로 이해하지 못해서 생긴 이유였다.

 

오늘도 하나얻었다. 코드테스트에서 넘어갔는데 제출에서 문제가 생겼다면 문제이해가 모자랐다는 것!

문제를 찬찬히 읽어보자! 예제만 읽고 이해했다 속단하지 말자!

 

아래는 앞으로 이런 생각도 하고 싶단 생각으로 모아온 코드다.

myString.toLowerCase().replace(/a/g, 'A');
myString.toLowerCase().replace(/a/g, () => 'A');
myString.toLowerCase().replaceAll('a','A');

위의 코드는 먼저 문자열내에서 다 해결하는 거라 좋았고, 또 먼저 코드들을 모두 소문자로 바꾸고 소문자 a를 A로 바꿔주는 코드였다. 나처럼 괜히 a와 A를 인정하는 코드를 언급않고 문제에서 원하는 방향대로 만든 코드라고 생각했다.

 

[...myString].map(e => e == 'a' || e == "A" ? "A" : e.toLowerCase()).join("");

map을 통해서도 하려 했었는데 map을 쓰면 뒤에 .을 써서 join을 써야했는데 이렇게 사용하신 분을 보니 꽤나 괜찮은거 같았다.

[...myString.replace(/a/g,'A')].map(v=>{
        if(/[B-Z]/.test(v)) return v.toLowerCase();
        return v;
    }).join('')

이게 내가 생각한 구조로 만든 코드였다. 막상 이렇게 작성된 코드를 보고 나니 역시 빠르게 reduce를 사용해서 문제를 푼게 나았다고 생각됐다.

map에 if 문과 test를 사용한 구조를 볼 수 있어서 좋았다.