반응형

약수 구하기

 

문제 설명

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ n ≤ 10,000

입출력 예nresult
24 [1, 2, 3, 4, 6, 8, 12, 24]
29 [1, 29]

입출력 예 설명

입출력 예 #1

  • 24의 약수를 오름차순으로 담은 배열 [1, 2, 3, 4, 6, 8, 12, 24]를 return합니다.

입출력 예 #2

  • 29의 약수를 오름차순으로 담은 배열 [1, 29]를 return합니다.

 

function solution(n) {
    var answer = [];

    for(let i = 1; i <= n; i++) {
        if (n % i === 0) answer.push(i);
    }

    return answer;
}

console.log(solution(24)); // [1, 2, 3, 4, 6, 8, 12, 24]
console.log(solution(29)); // [1, 29]

for문을 사용해 나머지가 0이 나오는 약수를 만들어줍니다. ( 자신이 포함되어야 하기 때문에 i <= n;으로 만들어줍니다. )

반응형
반응형

명예의 전당 (1)

 

문제 설명

"명예의 전당"이라는 TV 프로그램에서는 매일 1명의 가수가 노래를 부르고, 시청자들의 문자 투표수로 가수에게 점수를 부여합니다. 매일 출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당이라는 목록에 올려 기념합니다. 즉 프로그램 시작 이후 초기에 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르게 됩니다. k일 다음부터는 출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려오게 됩니다.

이 프로그램에서는 매일 "명예의 전당"의 최하위 점수를 발표합니다. 예를 들어, k = 3이고, 7일 동안 진행된 가수의 점수가 [10, 100, 20, 150, 1, 100, 200]이라면, 명예의 전당에서 발표된 점수는 아래의 그림과 같이 [10, 10, 10, 20, 20, 100, 100]입니다.

명예의 전당 목록의 점수의 개수 k, 1일부터 마지막 날까지 출연한 가수들의 점수인 score가 주어졌을 때, 매일 발표된 명예의 전당의 최하위 점수를 return하는 solution 함수를 완성해주세요.

제한사항
  • 3 ≤ k ≤ 100
  • 7 ≤ score의 길이 ≤ 1,000
    • 0 ≤ score[i] ≤ 2,000

입출력 예kscoreresult
3 [10, 100, 20, 150, 1, 100, 200] [10, 10, 10, 20, 20, 100, 100]
4 [0, 300, 40, 300, 20, 70, 150, 50, 500, 1000] [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]

입출력 예 설명

입출력 예 #1

  • 문제의 예시와 같습니다.

입출력 예 #2

  • 아래와 같이, [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]을 return합니다. 

 

function solution(k, score) {
    var answer = [];
    let arr = [];

    for (let i = 0; i < score.length; i++) {

        arr.push(score[i]);

        if (i < k) {
            answer.push(Math.min(...arr));
        } else {
            if (arr.length > k) {
                let cnt1 = Math.min(...arr);

                arr.sort((a, b) => {
                    if (a < b) return -1;
                    // else if (a > b) return 1;
                    // else return 0;
                }).shift()
            }

            answer.push(Math.min(...arr));
        }
    }

    return answer;
}

console.log(solution(3, [10, 100, 20, 150, 1, 100, 200])); // [10, 10, 10, 20, 20, 100, 100]
console.log(solution(4, [0, 300, 40, 300, 20, 70, 150, 50, 500, 1000])); // [0, 0, 0, 0, 20, 40, 70, 70, 150, 300]

먼저 최대 3개의 스코어가 들어가는 arr배열을 만들어서 일차마다 스코어를 하나씩 추가시켜줍니다. ( 4일차부터 가장 낮은 스코어를 탈락 시킨것을 확인하기 위해 )

 

이후, 3일차 까지는 answer에 가장 작은 스코어를 넣어줍니다.

4일차부터 가장 낮은 스코어를 찾은다음 sort() 메서드를 사용해서 낮은순서대로 정렬시킨 후 가장 앞에 있는 스코어 ( 가장 낮은 스코어 )를 빼줍니다. 이후 그중에서 다음으로 낮은 스코어를 추가 시켜줍니다.

:: sort()메서드는 string으로 간주하고 비교를 하기 때문에 compareFunction을 이용해야 합니다.

 

그렇게 answer에 매일 가장 하위 점수를 추가하고 반환해줍니다.

 

  • Math.min 함수: 주어진 숫자들 중 가장 작은 값을 반환합니다.
  • sort() 메서드: 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.
  • shift() 메서드: 배열에서 첫 번째 요소를 제거하고, 제거된 요소를 반환합니다.

 

소요시간 3시간 30분

반응형
반응형

편지

 

문제 설명

머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 message를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.


제한사항
  • 공백도 하나의 문자로 취급합니다.
  • 1 ≤ message의 길이 ≤ 50
  • 편지지의 여백은 생각하지 않습니다.
  • message는 영문 알파벳 대소문자, ‘!’, ‘~’ 또는 공백으로만 이루어져 있습니다.

입출력 예messageresult
"happy birthday!" 30
"I love you~" 22

입출력 예 설명

입출력 예 #1

  • message의 글자 수가 15개로 최소 가로 30cm의 편지지가 필요합니다.

입출력 예 #2

  • message의 글자 수가 11개로 최소 가로 22cm의 편지지가 필요합니다.

 

function solution(message) {
    var answer = 0;

    for(let i = 0; i < message.length; i++) {
        answer = answer + 2;
    }
    return answer;
}

console.log(solution("happy birthday!")); // 30
console.log(solution("I love you~")); // 22

한글자를 적을 떄마다 answer에 2씩 더해줍니다.

반응형
반응형

문자열 나누기

 

문제 설명

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.


제한사항
  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.

입출력 예sresult
"banana" 3
"abracadabra" 6
"aaabbaccccabba" 3

입출력 예 설명

입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.

입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.

입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.

 

function solution(s) {
    var answer = 0;
    let letter = "";
    let cnt1 = 0;
    let cnt2 = 0;
    
    for (let i = 0; i < s.length; i++) {
        if (letter === "") letter = s[i];
        
        if (letter === s[i]) cnt1++;
        else cnt2++;
        
        if (cnt1 === cnt2) {
            answer++;
            letter = "";
            cnt1 = 0;
            cnt2 = 0;
        }
    }
    if (cnt1 !== 0 || cnt2 !== 0) answer++;
    
    return answer;
}

console.log(solution("banana")); // 3
console.log(solution("abracadabra")); // 6
console.log(solution("aaabbaccccabba")); // 3

먼저 첫 번째 문자열을 비교하기 위해서 첫 번째 문자열을 letter에 넣어줍니다.

이후, 만약에 첫 번째 들어온 문자와 s[i]번째 들어온 문자가 같으면 cnt1번에 점수를 넣어주고, 다르면 cnt2번에 점수를 넣어줍니다.

for문을 계속 돌리던 중 cnt1과 cnt2의 점수가 같아지면 answer에 점수를 추가하고 나머지는 모두 초기화시켜줍니다.

 

ex ) banana => b === b = cnt1++ / b === a = cnt2++ => 초기화 n === n = cnt1++ / n === a = cnt2++ => 초기화 이런 식으로 가줍니다.

 

그런데, 2번 abr~부분은 a가 혼자 남으면서 cnt1과 cnt2가 같은 상황으로 끝나지 않았기 때문에 cnt1 or cnt2가 남거나 letter에 글자가 남아있으면 answer에 점수를 추가해 줍니다.

 

1단계부터는 문제 설명을 읽고 헷갈리는 부분이 많은 것 같습니다..ㅠ 문제만 10 ~ 20번 정도 읽은 것 같습니다...

반응형
반응형

가장 큰 수 찾기

 

문제 설명

정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 1 ≤ array의 길이 ≤ 100
  • 0 ≤ array 원소 ≤ 1,000
  • array에 중복된 숫자는 없습니다.

입출력 예arrayresult
[1, 8, 3] [8, 1]
[9, 10, 11, 8] [11, 2]

입출력 예 설명

입출력 예 #1

  • 1, 8, 3 중 가장 큰 수는 8이고 인덱스 1에 있습니다.

입출력 예 #2

  • 9, 10, 11, 8 중 가장 큰 수는 11이고 인덱스 2에 있습니다.

 

function solution(array) {
    var answer = [];

    answer.push(Math.max(...array));

    answer.push(array.indexOf(answer[0]));

    return answer;
}

console.log(solution([1, 8, 3])); // [8, 1]
console.log(solution([9, 10, 11, 8])); // [11, 2]

먼저 Math.max() 함수로 가장 큰 값을 추출하여 첫번째 인덱스에 넣어줍니다.

다음으로 indexOf() 메서드로 주어진 값과 일치하는 첫 번째 인덱스를 반환하여 추가해줍니다.

 

  • Math.max() 함수 : 입력값으로 받은 0개 잉상의 숫자 중 가장 큰 숫자를 반환합니다.
  • indexOf() 메서드 : 호출한 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환합니다. 일치하는 값이 없으면 -1을 반환합니다.

 

반응형
반응형

가장 가까운 같은 글자

 

문제 설명

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때,  각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

  • b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  • a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
  • n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
  • a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.

따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.


제한사항
  • 1 ≤ s의 길이 ≤ 10,000
    • s은 영어 소문자로만 이루어져 있습니다.

입출력 예sresult
"banana" [-1, -1, -1, 2, 2, 2]
"foobar" [-1, -1, 1, -1, -1, -1]

입출력 예 설명

입출력 예 #1
지문과 같습니다.

입출력 예 #2
설명 생략

 

function solution(s) {
    var answer = [];
    let arr = [];

    for(let i = 0; i < s.length; i++) {

        if (arr.length === 0) answer.push(-1);

        else {
            if (arr.includes(s[i])) answer.push(arr.length - arr.lastIndexOf(s[i]));
            else answer.push(-1);
        }

        arr.push(s[i]);
    }
    return answer;
}

console.log(solution("banana")); // [-1, -1, -1, 2, 2, 2]
console.log(solution("foobar")); // [-1, -1, 1, -1, -1, -1]

먼저 첫번째 글자는 같은 내용이 있을수 없기 때문에 -1을 기본적으로 넣어주고 시작합니다.

이후 두번째부터 includes() 메서드로 같은 글자가 있는지 없는지를 판단해줍니다.

없으면 -1을 넣어주고 있으면, 현재 arr의 총 길이( arr.length )와 현재 발견된 같은 글자의 마지막 인덱스 값( arr.lastIndexOf(s[i] )을 빼서 넣어줍니다.

 

  • includes() 메서드 : 배열이 특정 요소를 포함하고 있는지 판별합니다 ( boolean 값 )
  • lastIndexOf() 메서드 : 배열에서 주어진 값을 발견할 수 있는 마지막 인덱스를 반환합니다.
반응형
반응형

forEach() 메서드

forEach() 메서드는 주어진 함수를 배열 요소 각각에 대해 실행합니다.

 

구문

arr.forEach(callback(currentValue[, index[, array]])[, thisArg]);

 

매개변수

  • callback: 각 요소에 대해 실행할 함수입니다. 아래 세 가지 매개변수를 받습니다.
  • currentValue: 처리할 현재 요소입니다.
  • index: 처리할 현재 요소의 인덱스입니다.
  • array: forEach() 메서드를 호출한 배열입니다.
  • tihsArg: callback을 실행할 때 this로 사용할 값입니다.

 

반환 값

undefined입니다.

 

예제

const arr = ["a", "b", "c"];

arr.forEach(el => console.log(el));
// "a"
// "b"
// "c"

 

for() 반복문을 forEach() 반복문으로 바꾸기

const arr = ["item", "section", "div", "for", "forEach"];
const newArr = [];

// for() 반복문
for(let i = 0; i < arr.length; i++) {
  newArr.push(arr[i]);
};
console.log(newArr); // ['item', 'section', 'div', 'for', 'forEach']

// forEach() 반복문
arr.forEach((item) => {
  newArr.push(item);
});
console.log(newArr); // ['item', 'section', 'div', 'for', 'forEach']

 

배열 콘텐츠 출력하기

const arr = ["item", , "div", "for", "forEach"];

function record(el, index, array) {
  console.log("A[" + index + "] = " + el);
}

arr.forEach(record);
/*
  A[0] = item
  A[2] = div
  A[3] = for
  A[4] = forEach
*/

A[1]은 배열의 위치에 항목이 없기 때문에 건너뛰기 됩니다.

반응형
반응형

문자열 계산하기

문제 설명

my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.


제한사항
  • 연산자는 +, -만 존재합니다.
  • 문자열의 시작과 끝에는 공백이 없습니다.
  • 0으로 시작하는 숫자는 주어지지 않습니다.
  • 잘못된 수식은 주어지지 않습니다.
  • 5 ≤ my_string의 길이 ≤ 100
  • my_string을 계산한 결과값은 1 이상 100,000 이하입니다.
    • my_string의 중간 계산 값은 -100,000 이상 100,000 이하입니다.
    • 계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.
    • my_string에는 연산자가 적어도 하나 포함되어 있습니다.
  • return type 은 정수형입니다.
  • my_string의 숫자와 연산자는 공백 하나로 구분되어 있습니다.

입출력 예my_stringresult
"3 + 4" 7

입출력 예 설명

입출력 예 #1

  • 3 + 4 = 7을 return 합니다.

 

function solution(my_string) {
    var answer = 0;

    let arr = my_string.split(" ");

    for (let i = 0; i < arr.length; i++) {
        if(arr[i] === "+") {

          if (i === 1) answer = Number(arr[i - 1]) + Number(arr[i + 1]);
          else answer = answer + Number(arr[i + 1]);

        } else if (arr[i] === "-") {

          if (i === 1) answer = Number(arr[i - 1]) - Number(arr[i + 1]);
          else answer = answer - Number(arr[i + 1]);

        }
    }
    return answer;
}

console.log(solution("3 + 4 + 3")); // 10
console.log(solution("3 + 4 + 2 - 5")); // 4

연산자가 여러개가 있다고 가정하고, +가 나오면 첫번째 계산일 때 +의 앞뒤로 더해주고, 이후로는 뒤쪽 숫자만 더해줍니다. -도 마찬가지로 해줍니다.

eval()을 사용하면 간단하게 해결되지만 eval()은 사용하지 않는것이 좋기 때문에 빼고 진행했습니다.

 

:: 처음에 연산자가 하나만 있는줄 알고 그에 맞추어 풀었는데, 자꾸 10퍼센트만 맞다고해서 당황했습니다.. 중간에 잘 읽어보니 연산자가 적어도 하나 포함되어 있다는 문구가 있었습니다..ㅠㅠ

반응형
반응형

flatMap() 메서드

flatMap() 메서드는 먼저 매핑함수를 사용해 각 엘리먼트에 대해 map() 메서드를 수행 후, 결과를 새로운 배열로 평탄화해줍니다. 이는 깊이 1의 flat()이 뒤따르는 map()과 동일하지만, flatMap()은 아주 유용하며 둘을 하나의 메소드로 병합할 때 조금 더 효율적입니다.

 

구문

arr.flatMap(callback(currentValue[, index[, array]])[, thisArg]);

 

매개변수

  • callback: 새로운 배열의 엘리먼트를 생성하는 함수입니다. 3개의 인자를 받습니다.
  • index: 배열에서 처리되고 있는 현재 엘리먼트의 인덱스입니다.
  • array: map()이 호출된 배열입니다.
  • thisArg: callback실행에서 this로 사용할 값입니다.

 

반환 값

각 엘리먼트가 callback함수의 결과이고, 깊이 1로 평탄화된 새로운 배열입니다.

 

예제

map()과 flatMap()

let arr = [1, 2, 3, 4];

console.log(arr.map(x => [x * 2])); // [[2], [4], [6], [8]]

console.log(arr.flatMap(x => [x * 2])); // [2, 4, 6, 8]

console.log(arr.flatMap(x => [[x * 2]])); // [[2], [4], [6], [8]]

 

단어의 리스트를 생성합니다.

let arr1 = ["it's Sunny in", "", "California"];

console.log(arr1.map(x => x.split(" "))); // [["it's","Sunny","in"],[""],["California"]]

console.log(arr1.flatMap(x => x.split(" "))); // ["it's","Sunny","in","California"]

 

reduce + concat vs flatMap

var arr1 = [1, 2, 3, 4];

console.log(arr1.flatMap(x => [x * 2])); // [2, 4, 6, 8]

console.log(arr1.reduce((acc, x) => acc.concat([x * 2]), [])); // [2, 4, 6, 8]

 

반응형
반응형

배열의 유사도

 

문제 설명

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ s1, s2의 길이 ≤ 100
  • 1 ≤ s1, s2의 원소의 길이 ≤ 10
  • s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
  • s1과 s2는 각각 중복된 원소를 갖지 않습니다.

입출력 예s1s2result
["a", "b", "c"] ["com", "b", "d", "p", "c"] 2
["n", "omg"] ["m", "dot"] 0

입출력 예 설명

입출력 예 #1

  • "b"와 "c"가 같으므로 2를 return합니다.

입출력 예 #2

  • 같은 원소가 없으므로 0을 return합니다.

 

1번 방법

function solution(s1, s2) {
    var answer = 0;

    for(let i = 0; i < s1.length; i++) {
        for (let j = 0; j < s2.length; j++) {
            if (s1[i] === s2[j]) answer++;
        }
    }
    return answer;
}

console.log(solution(["a", "b", "c"], ["com", "b", "d", "p", "c"])); // 2
console.log(solution(["n", "omg"], ["m", "dot"])); // 0

2중 for문으로 하나씩 검사해줍니다.

 

2번 방법

function solution(s1, s2) {
    var answer = 0;
    
    for (let i = 0; i < s1.length; i++) {
        s2.filter(s => {
            if (s === s1[i]) answer++;
        })
    }
    return answer;
}

console.log(solution(["a", "b", "c"], ["com", "b", "d", "p", "c"])); // 2
console.log(solution(["n", "omg"], ["m", "dot"])); // 0

 

반응형

+ Recent posts