[알고리즘]프로그래머스 0단계 뽀개기(Day14)

HIHI JIN·2023년 3월 3일
0

알고리즘

목록 보기
15/29
post-thumbnail

Day 14

가까운 수

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

//내 코드
function solution(array, n) {
    array.push(n);
    array.sort((a,b)=>a-b);
    let i = array.indexOf(n);
    let a = Math.abs(array[i]-array[i-1]);
    let b = Math.abs(array[i]-array[i+1]);
    return a>b ? array[i+1]:array[i-1];
}

array에 n을 넣고 오름차순 정렬
n의 인덱스i를 구하고 인덱스i+1값을 뺀 절대값과 인덱스i-1값을 뺀 절대값 비교 후 작은 것 리턴

//다른 사람 코드
function solution(array, n) {
    return array[array.sort((a,b) => a-b).map((v) => Math.abs(v-n)).indexOf(Math.min(...array.map((v) => Math.abs(v-n))))]
}

array 오름차순 정렬
array 요소들을 요소 - n 절대값으로 array요소 바꾸기 n=13 arr=[10, 11, 12]-> [3,2,1]
새로운 array요소들을 요소 - n 절대값으로 array 요소 바꾸기 [3,2,1] -> [10, 11, 12][3,2,1]중 가장 작은 요소 인덱스(1)를 찾고, [10,11,12]에서 인덱스에 해당하는 값을 찾아줌 (12)

369게임

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.

//내 코드
function solution(order) {
    return String(order).split("").filter(v=>v==="3"|| v==="6" || v==="9").length;
}
//order를 split("") 배열로 만들기
//배열의 요소가 3으로 나눈값이 0이면===3의 배수라면 filter
//arr.length구하기

//다른 사람 코드
function solution(order) {
    return (''+order).split(/[369]/).length-1;
}

(''+order)쓰면 문자열+숫자=문자열 type으로 변한다.
split()은 괄호 기준으로 띄워진다.
split() 이 괄호 구분자를 기준으로 앞 또는 뒤에 아무 문자열이 없다면, 빈문자열을 반환한다.
앞이나 뒤 중 하나만 없다면 하나의 빈 문자열,
앞과 뒤 둘다 문자열이 없다면(===문자열이 애초에 였는데 그게 구분자였다면), 빈문자열 2개를 반환한다.

//또 다른 사람 코드
function solution(order) {
    var answer = [...order.toString().matchAll(/[3|6|9]/g)].length;
    return answer;
}

order를 tostring으로 문자열로 바꾸고,
matchAll(/[3|6|9]/g)으로 3이나6이나9 중 맞는 것이 있다면 배열에 남겨두기

//또 다른 사람 코드
function solution(order) {
    const mySet = new Set([3,6,9]);
    return String(order).split('')
                        .filter(num => mySet.has(Number(num)))
                        .length;
}

새로운 문자열[3,6,9]을 만든다.
order를 문자열로 바꾸고 배열로 바꾸고 새로운 배열이 order 요소를 가지고 있다면 filter한다.

암호 해독

군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.
암호화된 문자열 cipher를 주고받습니다.
그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(cipher, code) {
    return cipher.split("").filter((e,idx) => (idx+1)%code===0).join("");
}

code가 2라면 2의 배수인 인덱스만 찾아 cipher문자열에서 골라 filter시킨다.
cipher의 인덱스를 code로 나눈 나머지가 0인것만 filter해서 리턴

//다른 사람 코드
function solution(cipher, code) {
  var answer = "";
  for (let i = code - 1; i < cipher.length; i += code) {
    answer += cipher[i];
  }
  return answer;
}

code번째 문자마다 이어붙이는 방법
code-1을 한 이유는 인덱스는 0부터 시작이지만 code번째를 세는 건 1부터 세기 때문

대문자와 소문자

문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(my_string) {
    return my_string.split("").map(v => v===v.toLowerCase() ? v.toUpperCase():v.toLowerCase()).join("");
}

map을 써서 소문자라면 v.toLowerCase() 대문자라면 v.toUpperCase()

//다른 사람 코드
function solution(my_string) {
    var answer = '';
    for (let c of my_string) answer += c === c.toLowerCase() ? c.toUpperCase() : c.toLowerCase();
    return answer;
}

c가 소문자라면 부분 삼항연산자 쓴건 비슷하지만
answer += c === c.toLowerCase()
answer에 요소를 저장함과 동시에 c가 소문자라면?을 확인할 수 있다.

profile
신입 프론트엔드 웹 개발자입니다.

0개의 댓글