이번주차에 학습한 내용을 다루는 두개의 문제를 풀어보는 숙제를 받았다. 문제를 풀어보고 다른 사람들이 풀이한 코드와 비교하며 살펴보니 많은 것을 알게 되었다. 예를 들면, 정확히 같은 동작을 수행하지만 누군가의 코드는 훨씬 간결하고 메모리도 적게 사용하는가 하면 훨씬 빠르게 동작하는 코드가 존재했다.
같은 동작이더라도 어떻게 코드를 작성하는가에 따라 최적화 여부가 갈리는 점은 신기했다. 사용하는 프로그램 언어를 잘 이해하고 문법을 잘 활용하는 것으로 실력있는 개발자가 갈리는 것 같다.
문자열 연습하기
https://school.programmers.co.kr/learn/courses/30/lessons/12916
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
제한사항
- 문자열 s의 길이 : 50 이하의 자연수
- 문자열 s는 알파벳으로만 이루어져 있습니다.
나의 풀이
function solution(s){
let count = 0;
// p, y의 갯수가 같은지만 구분하면되므로 숫자를 셀 변수는 1개면 충분하다.
// 자바스크립트의 비교연산자는 대소문자를 구분하기 때문에 대소문자 구분 없이 숫자를 세기 위해서 문자열을 모두 소문자로 바꿔 숫자를 세기로 했다.
// 문자열의 요소를 검사해서, 'p'면 count에 1을 더하고 'y'면 1을 빼도록 코드를 작성했다.
for (let i = 0; i < s.length; i++) {
if (s[i].toLowerCase() === 'p') {
count++;
} else if (s[i].toLowerCase() === 'y') {
count--;
}
}
return count === 0;
}
다른 사람의 풀이
반복문 사용 없이 코드를 한줄로 작성한 모습이 멋져 보여서 가져왔다.
function numPY(s){
//함수를 완성하세요
return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}
“pPoooyY” 문자열을 입력할 경우
.toUpperCase()의 결과는 “PPOOOOYY”
s.toUpperCase().split(“P”)의 결과는 ['', '', 'OOOYY']
가 된다.
따라서 길이는 3이 된다.
s.toUpperCase().split(“Y”)의 결과는 [ 'PPOOO', '', '' ]
마찬가지로 길이는 3이 된다. 따라서 두 값이 같아지므로 True
를 반환한다.
내 코드와 동일한 결과를 출력하지만 변수를 추가로 선언하지 않아 메모리 등에서 이득을 많이 볼 것 같다. 이런 것이 코드의 최적화라고 하는 것인가보다.
반복문, 조건문 연습하기
https://school.programmers.co.kr/learn/courses/30/lessons/76501
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
제한사항
- absolutes의 길이는 1 이상 1,000 이하입니다.
- absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
- signs의 길이는 absolutes의 길이와 같습니다.
signs[i]
가 참이면absolutes[i]
의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.
나의 풀이
function solution(absolutes, signs) {
// absolutes의 길이만큼 반복하는 for문을 작성하고 같은 index의 signs의 값을 검사하여 참이면 값을 더하고, 거짓이면 값을 빼서 합계를 구함
var answer = 0; // 합계를 저장하기 위한 변수
for (let i = 0; i < absolutes.length; i++) {
if (signs[i]) {
answer = answer + absolutes[i]
} else {
answer = answer - absolutes[i]
}
}
return answer;
}
다른 사람의 풀이
function solution(absolutes, signs) {
return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);
}
단 한줄로 작성된 코드, reduce()
메소드를 사용한 점이 인상 깊어 가져왔다.
reduce()
메소드는 배열의 모든 요소를 반복하면서 하나의 값으로 축소하는 메소드이다. acc은 누적된 값, val은 현재 값이고 배열의 요소를 돌면서 값을 하나로 축소한다. 삼항연산자signs[i] ? 1 : -1
를 사용해서, true
면 양수를, false
면 음수로 변환될 수 있게 하였다.
이번 문제에서도 다른 사람의 풀이를 보니 문법을 숙지하고 잘 활용하는 것으로 코드를 보다 간결하게 작성할 수 있다는 점과, reduce()
메소드의 사용법을 알게되는 좋은 기회가 되었다. 설명만 듣고 예제를 몇번 입력해본 것으로는 명확히 이해하지 못했는데 이번 기회에 확실히 알게 된 것 같다.
로직을 보고 내가 작성해본 뒤 같은 기능을 하는 코드를 다른 사람이 작성한 것을 해석하며 배우는 것도 좋은 것 같다. 한번 작성해본 기능이기 때문에 다른 방식으로 작성한 코드도 쉽게 이해가 되고 더 효율적인 코드를 발견하면 기억에도 오래 남게 될 것 같다.
'Language > JavaScript' 카테고리의 다른 글
혼자서 공부하는 자바스크립트 Chapter 05 함수 (0) | 2023.04.08 |
---|---|
혼자서 공부하는 자바스크립트 Chapter 04 반복문 (0) | 2023.04.07 |
혼자서 공부하는 자바스크립트 Chapter 03 조건문 (0) | 2023.04.04 |
혼자서 공부하는 자바스크립트 Chapter 02 자료와 변수 (0) | 2023.04.03 |
혼자서 공부하는 자바스크립트 Chapter 01 자바스크립트 개요와 개발 환경 설정 (0) | 2023.04.02 |