sungyup's.

Web_Miscellaneous / Algorithm(JS) / 4.8 프로그래머스 Lv.0 #71~80

4.8프로그래머스 Lv.0 #71~80

프로그래머스 Lv.0 71~80번

개요

기초 트레이닝 문제(Lv.0) 71 ~ 80번 문제 풀이 중 배울 점이 있는 풀이들에서 배운 개념들을 내 것으로 만들고자 정리해본다.

72. 조건에 맞게 수열 변환하기 2

이 문제는 Lv.0에서 지금까지 풀어본 문제들 중 가장 난이도가 높은 문제였다. 주변에 있는 문제들이 특히나 쉬워서 더욱 그렇게 느껴졌다.

javascript
function solution(arr) { let counter = 0; while(true){ const next = arr.map(v => { if(v >= 50 && v % 2 === 0) return v / 2; if(v < 50 && v % 2 === 1) return v * 2 + 1; return v; }) if(arr.every((v, i) => v === next[i])) break; arr = next; counter++; } return counter; }

73. 1로 만들기

1로 만들기는 보고 약간의 꼼수(특정 범위의 숫자까지의 연산 횟수는 늘 같다는 것을 이용해, 범위를 지정해서 숫자를 할당)를 쓸 수 있겠다는 생각이 들었다. 물론 그리고 그 편이 복잡한 조건문이나 루프문보다 성능도 좋을것이다.

다만 우선 자바스크립트 문법을 정확하게 구사하는 것을 목표로 했기에 문제에 쓰인대로 풀었다. 내 답은 아래와 같다:

javascript
function solution(num_list) { const counterArray = []; let counter = 0; for(let i = 0; i < num_list.length; i++){ let num = num_list[i]; while(num !== 1){ if(num % 2 === 0){ num = num / 2 counter++; } else { num = (num - 1) / 2 counter++; } } counterArray.push(counter); counter = 0; } return counterArray.reduce((acc, cur) => acc += cur, 0) }

73-1. 수학적 풀이

사실 문제 자체에서 요구하는 사항대로 풀어낸 것이라고 생각하진 않지만, 답을 쉽고 가독성 있게 얻어낼 수 있는 풀이라는 측면에서 짚고 넘어갈만하다고 생각한다.

javascript
function solution(num_list) { return num_list.map(v => v.toString(2).length - 1).reduce((a, c) => a + c); }

79. A 강조하기

A 강조하기는 예외 케이스 중 "A"가 있으면 그대로 둬야한다는 사실을 잊고 약간 시간을 보냈던 문제다. 처음에는 인풋으로 받은 문자열 자체에서 for문을 돌렸었다. 아래는 나의 최종 답이다:

javascript
function solution(myString) { let answer = '' const lowerString = myString.toLowerCase(); for(let i = 0; i < lowerString.length; i++){ answer += lowerString[i] === "a" ? "A": myString[i].toLowerCase() } return answer; }

79-1. replaceAll

위의 로직을 replaceAll을 통해 보다 간단하게 바꿀 수 있다.

javascript
const solution=s=>s.toLowerCase().replaceAll('a','A');