티스토리 뷰

너무 즐거웠던 알고리즘 첫날!! 

오늘 가장 많은 시간을 투자했던 문제에서 정말 많은 것을 배웠다.

일단 이 문제를 보고 든 생각

1. 만약 4글자의 단어가 올수도 있고 단어마다 홀짝자리수를 판단해야 되니까 빈칸을 경계로 쪼개야 된다.

2. 각 단어마다 toUpperCase, toLowerCase를 쓰고 다시 합쳐야겠다.

창피하지만 이렇게 만들었다. 한 세시간 한듯..?

자.. 일단 "try word hello world"를 빈칸을 기준으로 나눈다. split(" ")을 하면 변화된 배열을 리턴한다.

그럼 fullArr는 ["try" , "word" , "hello" , "world"]가 된다.

근데 또 단어마다 홀짝 자리수에 대문자, 소문자 바꾸려면 알파벳 단위로 나눠야 되겠네?

모든 단어를 다 한글자씩 쪼갤거니까 for문을 돌면서 fullArr[i].split("")이렇게 해줬다. 그럼 배열이 반환되니까

['t','r','y'] 이런게 들어갔겠지?그걸 convertor라는 함수로 보낸다. convertor함수에서는 내가 의도한 대로 변화된 단어를 리턴시킬것이고

그걸 빈 배열에 넣은다음 마지막에 간격을 두고 띄어쓰기 된 채로 합칠것이다. 

convertor는 ['t','r','y'] 이런 배열을 받아서 for문으로 들어간다.

i는 0부터 배열의 길이만큼 올라갈건데, 그 숫자가 바로 자릿수나 마찬가지니까 2로 나눠서 나머지가 0이면 짝수니까 대문자로 만들어주고

아니면 홀수니까 소문자로 만들어준다.

toUpperCase같은건 원본을 바꾸는게 아니니까 바꾼 값을 그대로 다시 넣어준다.

그럼 for문을 돌고 나온 someSplitWord는 ['T','r','Y']이렇게 되어있겠지? 그걸 빈칸없이 다시 join("")으로 한 단어로 만들어서 리턴한다.

그럼 다시 함수를 나와서 fixedWord라는 빈 배열에 push해준다.

 

다음은 다른 분이 하신 것을 보며 배웠다.

 

너무 멋있다진짜... 

이 문제를 통해 map에 대해 공부하면서 메소드를 잘 알고 있으면 몸이 편하다는 것을 알았다.

해결방법은 비슷하다. 띄어쓰기로 나누고, 알파벳 하나하나 다 나눠서 index가 짝수면 대문자로 만들겠다. 

그리고 결합은 분해의 역순이다. 단어끼리 join하고 빈칸 사이에 두고 join하면 똑같이 완성된다.

이 문제를 통해 배운것은 if 가 생각날땐 삼항연산자를 떠올리고 for 가 생각날땐 map이나 forEach를 한번쯤 떠올려보자...

 


map

map은 콜백함수를 통해 배열의 각 요소를 바꿔준다. 그리고 값이 바뀐 배열을 리턴하며 기존 배열은 그대로 둔다.

for문보다 훨씬 가독성이 좋고 코드의 양도 줄어든다. 내가 보고 배운 모범답안에서 이해가 어려웠던 부분이라면 두번째 map에서

콜백함수의 인자를 두개 받는 부분이다.

찾아보니 첫번째는 기존배열의 값, 두번째는 기존 배열 값들의 인덱스 이다. 

어쩜 찰떡같이 이 문제에서 필요한 부분인데, 저 문제를 푸신분은 찰떡같이 저걸 썼을까.. 내 생각엔 정말 대단하다.

두번째 split을 하고나면 이런 모양의 2차원 배열이 된다. 

function toWeirdCase(s) {
  return s
    .split(" ")
    .map((i) =>
      i.split("").map((j, key) => (key % 2 === 0 ? j.toUpperCase() : j))
    );
}

두번째 map의 arrow 콜백 함수 (j,key) => key % 2 === 0 ? j.toUpperCase() : j 에서 

j는 ['t' , 'r' , 'y'] , ['h' , 'e' , 'l' , 'l' , 'o'] , ['w' , 'o' , 'r' , 'l' , 'd'] 일 것이고,

key는 각 배열의 Index이다. 여기서 나는 if를 썼는데 3항연산자를 생각했다면 훨씬 편했을 것이다.

그리고 이 뒤로는 합쳐주면 끝이다.

 

map 과 filter는 궁합이 좋은 메소드다

map으로 데이터를 변형하기 전에 filter로 부적절한 데이터를 걸러줄 수 있다. 

둘다 모두 새로운 배열을 반환하는 메소드다

map 과 if

위 문제처럼 map 안에서 3항연산자가 편한 경우도 있지만 if가 필요한 경우도 있다. if는 범위를 크게 잡을수도 있고 아주 작게 잡을 수도 있다는 점에서 유용하게 사용할 수 있다.

 


 

아직 이해안되는 부분: 새로운 배열을 반환한다는 것까지 이해하는데 return이 꼭 필요하다는 것은 아직 잘 이해가 안됨.

그리고 map과 달리 forEach는 단순히 배열을 순회하는 것이고 map은 순회하고 새 배열을 얻을 수 있다는데 아직 이해가 잘 안됨.

 

그리고 for문이 생각나면 map이나 forEach를 떠올리듯이 if가 생각날땐 항상 3항연산자도 생각해볼것!

'항해99 개발일지' 카테고리의 다른 글

항해99 1주차 WIL  (0) 2022.03.14
콜라츠 추측 / while  (0) 2022.03.12
flask, jinja2 / 항해 1주차 프로젝트 최대의 난관  (0) 2022.03.10
항해99 사전학습 4주차  (0) 2022.02.07
항해99 사전학습 3주차  (0) 2022.02.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함