프로그래머스 배열에서 문자열 대소문자 변환하기
문제 설명
문자열 배열 strArr가 주어집니다. 모든 원소가 알파벳으로만 이루어져 있을 때, 배열에서 홀수번째 인덱스의 문자열은 모든 문자를 대문자로, 짝수번째 인덱스의 문자열은 모든 문자를 소문자로 바꿔서 반환하는 solution 함수를 완성해 주세요.
✅ 내 코드
방법1> map()사용하여 원본유지
function solution (strArr) {
return strArr.map((str, i) => {
if(i%2 ===0) {
return str.toLowerCase()
} else {
return str.toUpperCase()
}
})
}
toLowerCase()와 toUpperCase()는 전에 여러번 써본 기억이 있어서 바로 strArr에 적용하려고 했는데, 이 메서드들의 경우 문자열에만 쓸수가 있고 strArr는 배열이기 때문에 쓸수가 없었다.
그래서 이 문제를 풀면서 제일 어려웠던 부분은 어떻게 각 배열의 홀수번째/짝수번째 인덱스들을 문자열로 바꿔야할까..였다.
또한 인덱스가 계속 홀/짝/홀/짝 반복되는 문제였기 때문에 인덱스를 어떻게 이용하면 좋을까 생각했다.
배열의 인덱스를 돌면서 처리를 할 수 있는 방법을 생각하다가 for문과 map()을 이용하면 되겠다는 생각이 들었다.
그래서 우선 map()을 사용한 방법은 위의 코드와 같다.
if문을 이용해서 짝수인 경우 toLowerCase()를 사용해서 소문자로, 그렇지 않은 경우에는 toUpperCase()를 사용해서 대문자로 만들어주도록 하였다. map()의 경우 콜백함수에서 반환된 값들을 모아서 새로운 배열을 생성한다. 그래서 map이 반환하는 값이 최종값이 된다.
방법2> for문을 사용해서 원본변경
function solution(strArr) {
for (let i = 0; i < strArr.length; i++) {
if (i % 2 === 1) {
strArr[i] = strArr[i].toUpperCase();
} else {
strArr[i] = strArr[i].toLowerCase();
}
}
return strArr;
}
for문을 사용해서 인덱스를 돌면서 값을 변경한다.
만약 인덱스가 홀수이면, 홀수인 인덱스의 값을 toUpperCase()를 이용해서 대문자로 변경하고 반대면 소문자로 변경한다.
이 코드를 작성하면서 처음에 막혔던 점은 strArr[i].toUpperCase()라고만 써주고 그값을 strArr[i]에 대입하지 않았던 점이다.
저렇게 대입하는 식을 세우지 않으면 원본배열의 값을 수정하지 않기 때문에 아래에서 리턴을 해주어도 값이 변경되지 않고 반환된다.
어떤 코드가 더 좋은지는 원본을 유지해야하는지, 아니면 원본을 변경해야하는지 상황에 따라서 다를것이다.
💻 다른사람 코드중에 배울 것 1
function solution(strArr) {
return strArr.map((v, i) => i % 2 === 0 ? v.toLowerCase() : v.toUpperCase());
}
처음에 map()을 생각하고 만들고 싶었던 코드였다. 굳이 if문을 사용하지 않더라도 삼항연산자를 사용해서 훨씬 간단하게 표현할 수 있다.
💻 다른사람 코드중에 배울 것 2
const solution = (strs) => strs.reduce(
(acc, cur, idx) => [...acc, idx % 2 === 0 ? cur.toLowerCase() : cur.toUpperCase()], []
)
reduce를 이용하는 방법도 궁금했는데 이렇게 푼 코드가 있어서 공부해보았다.
먼저 초기값으로 []빈배열을 넣고, 인자로는 acc,cur,idx를 넣었다. 그런 다음 ...acc로 현재까지 축적된 배열을 복사하고, 인덱스가 짝수인 경우는 현재 value에 toLowerCase()을 반대인 경우에는 toUpperCase()를 해주었다.
그래도 바로 전에 풀었던 문제에서 reduce의 초기값에 빈배열을 넣고, acc를 스프레드 연산자로 복사한뒤에 cur를 변경하고 []를 통해 새로운 배열을 생성하는 과정을 한번 공부해두어서 이해하기 어렵지는 않았다. 다음에는 이런 코드로도 풀 수 있도록 해봐야겠다.