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

앗차! reduce는 그냥 쓰면 문자열로 만들었지!

by 금화맘 2023. 7. 18.

오늘도 프로그래머스에서 문제를 풀다가 reduce로 풀 수 있을거 갖아서 배열에서 문자열 대소문자 변환하기 문제를 선택했다. 그리고 나 스스로 로직을 짯다.

먼저 strArr배열에서 홀수 인덱스를 구분하는 !i%2면 "홀수"

그 외의 값은 당연히 짝수번째 인데그가 되기 때문에 나머지는 "짝수"가 되서 

답은 [홀수,짝수,홀수,짝수] 이런식으로 나오는 걸 기대하고 코드를 작성했다.

? 뭔가 이상한데?

짝수 혹은 홀수 이렇게만 답이 나왔다...?

 

그래도 일단 분기처리가 되는거 같으니 매서드인 toLowerCase()를 사용해 보자라고 생각해서 코드를 작성했다.

 

근데 toLowerCase()에서.. 괄호 안에 변수를 넣는거였는지... 앞에 넣는건지 기억이 안나서 검색해서 다시 찾아봤다.ㅎ 

다시 숙지를 하고 넣었는데 답이[]로 나오는게 아니라"로 나왔다. 게다가 aaaBBBCCC 이런 식으로 나왔다.

뭐가 문제지? 라고 했다가 reduce로 작업했을 때 한개의 문자열로 만드는데 주로 사용했던기 생각났다.

곧장  map 함수로 바꿔서 사용했다.

var answer = [];
strArr.map((a,i) => i%2 ? answer.push(a.toUpperCase()) : answer.push(a.toLowerCase()))

이렇게 map을 이용해서 i가 짝수면 대문자로 바꿔서 answer 배열에 넣고  홀수면 소문자로 바꿔서 answer 배열에 넣어서 answer를 return하는 걸로 만들었다. 그리고 통과!

 

 var answer = strArr.reduce((acc, curr, i) => {
    return acc.concat(i % 2 ? curr.toUpperCase() : curr.toLowerCase());
  }, []);

그리고 이건 reduce로 풀었을 때 어떻게 하면 될까 고민하다가 배열로 만들어 주면 될거 같은데 좋은 방법 없나 고민하다가 결국 ai한테 물어봐서 얻어낸 답이다. return concat이라니... 역시 똑똑한 ai인거 같다.

const solution = (strs) => strs.reduce(
    (acc, cur, idx) => [...acc, idx % 2 === 0 ? cur.toLowerCase() : cur.toUpperCase()], []
)

그리고 이건 다른 사람 풀이에 들어가서 본 푸는 방법이었다..이거 딱 보자마자 어? 내가 푼거랑 비슷한데? 내가 역시 숙련자는 다르구나 싶었다. 사실 바로 어제 풀었던 것과 비슷하게 풀 수 있을 거 같아서 어제 이렇게 푼 분이 계시길래 나도 좀 배우고 싶어서 따라했는데 나는 [] 괄호의 위치를 제대로 잡지 못해서 오류가 난걸 알 수 있었다. 역시 뭐라도 해보고 답을 보니 모자란 점을 알 수 있어서 너무 좋았다.