오늘도 프로그래머스에서 문제를 풀었어요.
조건문이라 되어 있어서 if나 그렇게 풀면 되는가? 했는데..
일단 저는 조건문이나 if문 안했어요...
일단 문제는
정수 n과 문자열 control이 주어집니다.
- "w" : n이 1 커집니다.
- "s" : n이 1 작아집니다.
- "d" : n이 10 커집니다.
- "a" : n이 10 작아집니다.
control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다. 가장 마지막에 나오는 n의 값을 반환할 것
입니다.
예시는
이랬고 설명은
- 0 → 1 → 0 → 10 → 0 → 1 → 0 → 10 → 0 → -1 → -2 → -1
- 따라서 -1을 return 합니다.
이랬습니다.
그래서 이걸 보고 ->는 +기로 쓰면 되겠고, 커지는건 양수, 작아지는건 음수로 설정했어요.
function solution(n, control) {
const match = {
"w" : 1,
"s" : -1,
"d" : 10,
"a" : -10
}
var answer = [... control].reduce((a,b)=>a+match[b],n);
return answer;
}
저는 이렇게 매치 객체를 선언했답니다.
위의 코드가 합격코드랍니다.
처음에 매치 객체를 만들고 answer에 식을 구현했습니다.
처음에 [... new Array()].reduce((a,b) => b === b.match(match) ? a+b : a+b, n) 라고했는데
... new array().recude를 하니 빈 array 와 reduce는 쓸 수 없다는 에러메시지를 받았어요...
그래서 앞에 뭘 넣어야 하나 고민하다가 control에다 붙여서? 값을 변환해야 하니까 contol을 배열로 바꿔야 겠다 생각해서 ... 분해를 사용해서 배열로 반들어 붙였어요.
그리고 reduce안에도 문제였는데 b.match(match)가 있을 수 없는 거였잖아요? a+b를 두번 쓴건 저건 테스트 용? 삼항연상자를 만들어야 하니 한번 써보자 이렇게 되서 쓴거라 의미는 없고 그냥 문법이나 맞춰보자고 썻어요.
암튼 그랫 match에 대해 내가 미숙한거 같아서 match 사용법을 보니 오히려 이해가 안되더라구요.
객체를 match로 해놔서 그런가...->아님
match 객체를 선언했으니까 replace를 써도 되지 않을까? 라는 생각이 들어서 b.replace(match)를 했는데 이것도 에러메시지를 반환하더라구요...
암튼 그래서 chatgpt에다가 "w,a,s,d로 이루어진 control이란 문자열이 있어 w:1,2:-1,d:10,a:-10 이야 이걸 reduce와 map으로 풀고 싶은데 어떻게 해?" 이러헤 물어봤어요.
[...control].reduce((acc, curr) => acc + controlMap[curr], 0)
이렇게 알려주더라구요. 오~ 객체와 c를 해서 그냥 더했구나 란걸 알 수 있었어요.
어차피 ->를 +이걸로 생각했으니까 전체를 더하는 거라 생각해서 reduce를 쓴거라 객체에[]로 위치 지정을 하는 걸 생각지 못했단걸 꺠닳을 수 있었어요.
그도 그럴께 객체 안에 "w" : 1, "s" : -1, 값을 이렇게 매핑해놔서 어떻게 써야 할 줄 몰랐던 거죠...
새삼 다시 내가 객체 자체에 약하단걸 알 수 있는 소중한 시간이 됐어요.
오늘의 획득
1.reduce에서 acc,curr, initial 에 대한 개념을 확실히 알고 있다는 걸 알았다.
2. 매핑해서 쓰려고 객체를 생각해냈다.
3. 문자열을 배열로 만드는데 많이 익숙해 졌다!
내일의 나아질 점
1. 객체 다루는 법
2. match와 replace의 사용법
'자기개발 > TIL' 카테고리의 다른 글
앗차! reduce는 그냥 쓰면 문자열로 만들었지! (0) | 2023.07.18 |
---|---|
array.from({length:?}...로 줄어드는 배열 만들기 (0) | 2023.07.15 |
문자열에서 특정 문자를 대문자로 변환하기 (0) | 2023.07.13 |
숫자인데 string이면? (0) | 2023.07.12 |
특정 문자열로 시작하는지 확인 (0) | 2023.07.11 |