코로 넘어져도 헤딩만 하면 그만
JS 프로그래머스 (입문) 12-14일차 본문
💡모음 제거하기
function solution(my_string) {
return my_string.split('').filter(char => !'aeiou'.includes(char)).join('');
}
!'aeiou'를 통해 char이 모음 리스트에 포함되지 않는 경우에만 filter한 뒤 join으로 문자열화 시켜 묶어준다.
아래와 같이 replace()와 정규 표현식으로 사용할 수도 있다.
tip: replace() 메서드는 pattern의 단일, 일부 혹은 모든 일치 항목이 replacement로 대치된 새 문자열을 반환한다.
function solution(my_string) {
return my_string.replace(/[aeiou]/g, '');
}
💡숨어있는 숫자의 덧셈
function solution(my_string) {
let answer = 0;
const array = my_string.split("");
for(let i=0; i< array.length; i++){
if(!isNaN(array[i])){
answer = answer + Number(array[i])
}
}
return answer;
}
!isNaN으로 숫자의 여부를 판단한다. 덧셈을 하기 전에는 Number()로 다시 숫자로 바꿔야 한다.
💡소인수분해
소인수분해는 총 세 가지 조건을 갖고 판별한다.
1) 2로 나누어지는 경우
2) 2가 아닌 홀수로 나누어지는 경우(i+=2), 특히 효율을 위해 제곱근만큼만 계산.
3) 자기 자신으로만 나누어지는 경우 스스로가 소인수가 된다.
n을 조건에 따라 계속 나누어가며 소인수를 찾는다.
function solution(n) {
const factors = [];
if (n % 2 === 0) {
factors.push(2);
while (n % 2 === 0) {
n = n / 2;
}
}
for (let i = 3; i <= Math.sqrt(n); i += 2) {
if (n % i === 0) {
factors.push(i);
while (n % i === 0) {
n = n / i;
}
}
}
if (n > 2) {
factors.push(n);
}
return factors;
}
💡중복 문자 제거
function solution(my_string) {
let answer = [];
let array = my_string.split("");
for (let i = 0; i < array.length; i++) {
if (!answer.includes(array[i])) {
answer.push(array[i]);
}
}
return answer.join("");
}
!answer.includes()로 해당하지 않는 글자만 배열에 추가되도록 하였다.
반복문자 제거하는 Set을 통해 간단하게 해결한 방법이 있어 기록한다.
function solution(my_string) {
return [...new Set(my_string)].join('');
}
💡삼각형 조건
function solution(sides) {
const sortedList = sides.sort();
if(sortedList[2] < sortedList[0]+sortedList[1]){
return 1;
} else {
return 2;
}
}
삼각형의 조건은 가장 긴 변의 길이가 다른 두 변의 길이 합보다 작아야 함이다.
sort()를 통해 오름차순으로 정렬한 뒤 조건을 주어 해결했다. 유사하지만 삼항 연산자를 통해 푸는 법을 기록한다.
function solution(sides) {
sides = sides.sort((a,b) => a-b)
return sides[0]+sides[1] > sides[2] ? 1 : 2;
}
💡가까운 수
function solution(array, n) {
let answer = array[0];
for(let i=1;i<array.length;i++){
if(Math.abs(array[i]-n)<Math.abs(answer-n)){
answer = array[i]
} else if (Math.abs(array[i]-n)===Math.abs(answer -n) && array[i] < answer){
answer = array[i]
}
}
return answer;
}
Math.abs()로 절댓값을 구할 수 있다. 두 수가 같을 때 더 작은 수를 리턴하는 조건에서 막혀서 고심했다.
array[0]을 초기 answer값으로 정한 뒤 비교해가면서 바꿔치기 하는 방법이다.
💡369 문제
function solution(order) {
let answer = 0;
const tsn = ["3","6","9"];
const numArr = order.toString().split("");
numArr.forEach(num=>{
if(tsn.includes(num)){
answer +=1
}
})
return answer;
}
split()메서드는 문자열에만 사용 가능하며, 숫자일 경우 toString()로 문자열로 변환한 뒤에 풀어야 한다.
forEach와 includes 메서드를 사용해서 풀어보았다. tsn은 배열이기 때문에 배열에 단일문자 num이 포함되는지 확인하고 그 개수만큼 answer을 증가시킨다.
하단은 Set와 has를 사용한 풀이법, filter을 사용한 풀이법으로 한번쯤 살펴볼 만 하다.
function solution(order) {
const mySet = new Set([3,6,9]);
return String(order).split('')
.filter(num => mySet.has(Number(num)))
.length;
}
function solution(order) {
return order
.toString()
.split("")
.filter((v) => v === "3" || v === "6" || v === "9").length;
}
💡암호 해독
function solution(cipher, code) {
const answer = [];
const cipherArr = cipher.split("");
for(let i=code-1;i<cipherArr.length;i+=code){
answer.push(cipherArr[i]);
}
return answer.join("");
}
간단하게 풀었는데 사실 배열로 만들 필요가 없었던 것 같다.
function solution(cipher, code) {
var answer = "";
for (let i = code - 1; i < cipher.length; i += code) {
answer += cipher[i];
}
return answer;
}
💡대소문자 체인지
처음에 대소문자를 전부 나열한 뒤에 indexOf로 찾는 방식으로 풀었다. map을 통해 삼항 연산자로 깔끔하게 쓰는 방법이 있어서 기록해둔다.
function solution(my_string) {
return my_string.split('').map(n =>
n === n.toUpperCase() ? n.toLowerCase() : n.toUpperCase()).join('')
}
'JavaScript > 프로그래머스 문제풀이' 카테고리의 다른 글
JS 프로그래머스 (입문) 15-20일차 (2) | 2024.07.23 |
---|---|
JS 프로그래머스(입문) 풀이 정리 Day 3-4 (2) | 2024.07.05 |
JS 프로그래머스(입문) 풀이 정리 Day1-2 (1) | 2024.07.02 |