본문 바로가기
JS 공부

JS문법종합반 1주차 과제

by 나노다 2024. 11. 4.

1번 문제 풀이

1) 구조 생각해보기

문자열 s가 입력됨
s에서 p나 y가 0개라면 answer = 'true'
p와 y의 개수가 같다면 answer = 'true'
다르다면 answer = 'false'

2) p나 y의 개수를 셀 방법 구상하기

문자열에서 특정문자의 개수를 알아내는 방법이 뭘까?

문자열을 배열로 만들고 배열의 특정 요소를 찾는 메서드를 활용하면 될 것 같다
문자열을 배열로 만드는 법엔 ...연산자, Array.from(), 또는 split() 등이 있다
안 해본 방법인 Array.from()을 활용해보자

let str = "Hello!"

/* ...연산자 활용 */
let array1_str = [...str];
console.log(array1_str); // 반환 : ["H", "e", "l", "l", "o", "!"]

/* Array.from() 활용 */
let array2_str = Array.from(str);
console.log(array2_str); // 반환 : ["H", "e", "l", "l", "o", "!"]

/* split() 활용 */
let array3_str = str.split("");
console.log(array3_str); // 반환 : ["H", "e", "l", "l", "o", "!"]

 

3)  각각의 개수를 비교할 방법 구상하기

배열로 만든 문자열s에 반복문을 적용해서 p나 y가 발견될 때마다 개수를 표현할 변수에 1을 더해줘보자
countP와 countY라는 변수를 선언하고 초기값으로 0을 할당,
대소문자 구분 없이 세야하니 ||연산자를 활용해 둘 다 체크해주자

let countP = 0;
let countY = 0;
let array_s = Array.from(s);

for (let i = 0; i < array_s.length; i++) {
    if (array_s[i] === 'p' || array_s[i] === 'P') {
        countP++;
    } else if (array_s[i] === 'y' || array_s[i] === 'Y') {
        countY++;
    }
}


4) 조건문을 통해 반환할 answer 값 설정하기

개수가 같을 때도 true고 p나 y가 아예 없을 때도 true라서 현 문제에서 두 조건을 분리할 필요는 없지만, 명시적으로 짜기 위해서 굳이 분리해주자. case문으로 다시 연습해봐도 좋겠다

 if (countP === 0 && countY === 0) {
      answer = true;
  } else if (countP === countY) {
      answer = true;
  } else {
      answer = false;
}


다른 풀이와 비교 후 느낀 점

숙련자들은 "단 한 줄"로 코드가 끝나더라.... 메서드의 활용법을 숙지해야할 필요성을 팍팍 느꼈다.

특히 reduce()메서드를 활용하는 방식이 인상 깊던데, 활용도가 높은 메서드일수록 완벽히 이해하기가 어려운 거 같다. 자주 보고 자주 쓰며 연습해보자!

 

2번 문제 풀이

1) 구조 생각해보기

최종 배열의 합을 구하기 전에, 그 최종 배열을 우선 완성시켜줘야겄다.

signs 배열의 요소들을 바탕으로 absolutes 배열의 요소들에 부호를 추가시켜준 새 배열을 만들어보자

 

2) 새로운 정수들을 담을 배열을 만들고, 반복문을 통해 배열에 요소들을 채워주기

배열은 또 써야하니 전역 변수로 선언해주고, 총합을 담을 변수도 미리 선언해주자.

합을 담을 변수에 초기값 0을 할당시켜주지 않으면, 이따가 수많은 NaN을 만날 수 있다...

let Nums = [];
let sum_Nums = 0;

 

이제 반복문을 통해 signs 배열의 요소들을 비교해가며 절대값을 정수들로 바꿔주고, 그 결과를 최종 배열에 추가해주자

absolutes와 signs 배열의 길이는 동일하니 조건식에 뭐가 들어가도 상관 없고, 물음표 연산자 연습할 겸 활용해 보았다

for (let i = 0; i < absolutes.length; i++) {
    let num;
    (signs[i]) ? num = absolutes[i] : num = -1 * absolutes[i];
    Nums.push(num);
}

 

3) 새로운 배열 속 요소들의 총합 구하기

역시 반복문을 활용해볼 건데, 배열이니까 관련 메서드인 forEach()를 써먹어보자

Nums.forEach(function(item) {
    sum_Nums += item;
});
    
answer = sum_Nums;


다른 풀이와 비교 후 느낀 점

지금 수준에선 모든 단계를 하나하나 구현하고 있다면, 숙련자들은 결과가 맞다면 더 짧은 길을 택하고 있었다.

특히 굳이 부호를 다시 부여해서 그걸 더해주는 것 보다, 어차피 총합 구할 거니까 바로바로 더하고 빼주는 방식이 참 인상 깊었고, 나도 열심히 훈련해서 그런 효율적인 알고리즘을 떠올릴 수 있는 사고력을 얻고 말 겨...