반응형

3진법 뒤집기

 

문제 설명
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
n은 1 이상 100,000,000 이하인 자연수입니다.
입출력 예

n return
45 7
125 229


입출력 예 설명
입출력 예 #1

답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
45 1200 0021 7
따라서 7을 return 해야 합니다.
입출력 예 #2

답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
125 11122 22111 229
따라서 229를 return 해야 합니다.

 

function solution(n) {
    var answer = 0;
    
    answer = parseInt(n.toString(3).split("").reverse().join(""), 3);
    
    return answer;
}

console.log(solution(45)); // 7
console.log(solution(125)); // 229

2진법 3진법으로 바꾸는 방법을 몰라서 찾아보니...

toString()을 사용하면 2진법 3진법이 가능하다는것을 오늘 처음알게 되었습니다 ㄷㄷ..

 

다른 사람의 풀이

const solution = (n) => {
    return parseInt([...n.toString(3)].reverse().join(""), 3);
}

비슷하면서도 다른듯한 전개 구문...

 

또 다른 사람의 풀이

function solution(n) {
    const answer = [];
    while(n !== 0) {
        answer.unshift(n % 3);
        n = Math.floor(n/3);
    }
    return answer.reduce((acc,v,i) => acc + (v * Math.pow(3, i)),0);   
}

이런것도 좋은거같네요 ㅎㅎ ( 내장함수 없이 푸는 방법 !! )

반응형
반응형

두 개 뽑아서 더하기

 

문제 설명
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

제한사항
numbers의 길이는 2 이상 100 이하입니다.
numbers의 모든 수는 0 이상 100 이하입니다.
입출력 예

numbers  result
[2,1,3,4,1] [2,3,4,5,6,7]
[5,0,2,7]  [2,5,7,9,12]


입출력 예 설명
입출력 예 #1

2 = 1 + 1 입니다. (1이 numbers에 두 개 있습니다.)
3 = 2 + 1 입니다.
4 = 1 + 3 입니다.
5 = 1 + 4 = 2 + 3 입니다.
6 = 2 + 4 입니다.
7 = 3 + 4 입니다.
따라서 [2,3,4,5,6,7] 을 return 해야 합니다.
입출력 예 #2

2 = 0 + 2 입니다.
5 = 5 + 0 입니다.
7 = 0 + 7 = 5 + 2 입니다.
9 = 2 + 7 입니다.
12 = 5 + 7 입니다.
따라서 [2,5,7,9,12] 를 return 해야 합니다.

 

function solution(numbers) {
    var answer = [];
    
    let arr = [];
    
    for (let i = 0; i < numbers.length - 1; i++) {
        for (let j = i + 1; j < numbers.length; j++) {
            if (!arr.includes(numbers[i] + numbers[j])) {
                arr.push(numbers[i] + numbers[j])
            }
        }
    }
    
    answer = arr.sort((a, b)=> a - b)
    return answer;
}

console.log(solution([2,1,3,4,1])); // [2,3,4,5,6,7]
console.log(solution([5,0,2,7])); // [2,5,7,9,12]

 

다른 사람의 풀이

function solution(numbers) {
    const temp = []

    for (let i = 0; i < numbers.length; i++) {
        for (let j = i + 1; j < numbers.length; j++) {
            temp.push(numbers[i] + numbers[j])
        }
    }

    const answer = [...new Set(temp)]

    return answer.sort((a, b) => a - b)
}

전개 구문과 Set을 잘 쓰면 정말 편하긴 하겠습니다 ㅎㅎ

반응형
반응형

K번째수

 

문제 설명
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.
입출력 예

array  commands  return
[1, 5, 2, 6, 3, 7, 4]  [[2, 5, 3], [4, 4, 1], [1, 7, 3]]  [5, 6, 3]


입출력 예 설명
[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

 

function solution(array, commands) {
    var answer = [];
    
    for (let i = 0; i < commands.length; i++) {
        answer.push(array.slice(commands[i][0] - 1, commands[i][1]).sort((a, b) => a - b)[commands[i][2] - 1])
    }
    
    return answer;
}

console.log(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]])); // [5, 6, 3]

 

다른 사람의 풀이

function solution(array, commands) {
    return commands.map(command => {
        const [sPosition, ePosition, position] = command
        const newArray = array
            .filter((value, fIndex) => fIndex >= sPosition - 1 && fIndex <= ePosition - 1)
            .sort((a,b) => a - b)    

        return newArray[position - 1]
    })
}

와웅..3번째 줄이 인상적입니다..!

반응형
반응형

완주하지 못한 선수

 

문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예

participant  completion  return
["leo", "kiki", "eden"]  ["eden", "kiki"]  "leo"
["marina", "josipa", "nikola", "vinko", "filipa"]  ["josipa", "filipa", "marina", "nikola"]  "vinko"
["mislav", "stanko", "mislav", "ana"]  ["stanko", "ana", "mislav"]  "mislav"


입출력 예 설명
예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

function solution(participant, completion) {
    var answer = '';
    
    let arr1 = participant.sort();
    let arr2 = completion.sort();
    
    for (let i = 0; i < arr1.length; i++) {
        if (arr1[i] !== arr2[i]) return answer = arr1[i]
    }
    return answer;
}

console.log(solution(["leo", "kiki", "eden"], ["eden", "kiki"])); // leo
console.log(solution(["marina", "josipa", "nikola", "vinko", "filipa"], ["josipa", "filipa", "marina", "nikola"])); // vinko
console.log(solution(["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"])); // mislav

 

다른 사람의 풀이

var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))

어떤 분께서 해석해주셨네요..!

var solution=(participant,completion)=>participant.find(name=>!completion[name]--,completion.map(name=>completion[name]=(completion[name]|0)+1))

// 완주자 배열을 {이름:완주자배열에 등장하는 횟수}로 맵핑하고, 그 맵에 참가자 이름 하나씩 넣어서 찾아볼때마다 횟수 떨어뜨려서 횟수 0나오는 놈 찾아뱉는 함수같네요

재미있는 내용이었던것같습니다..!

반응형
반응형

예산

 

문제 설명
S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한사항
d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.
입출력 예

d budget result
[1,3,2,5,4] 9 3
[2,2,3,3] 10 4


입출력 예 설명
입출력 예 #1
각 부서에서 [1원, 3원, 2원, 5원, 4원]만큼의 금액을 신청했습니다. 만약에, 1원, 2원, 4원을 신청한 부서의 물품을 구매해주면 예산 9원에서 7원이 소비되어 2원이 남습니다. 항상 정확히 신청한 금액만큼 지원해 줘야 하므로 남은 2원으로 나머지 부서를 지원해 주지 않습니다. 위 방법 외에 3개 부서를 지원해 줄 방법들은 다음과 같습니다.

1원, 2원, 3원을 신청한 부서의 물품을 구매해주려면 6원이 필요합니다.
1원, 2원, 5원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
1원, 3원, 4원을 신청한 부서의 물품을 구매해주려면 8원이 필요합니다.
1원, 3원, 5원을 신청한 부서의 물품을 구매해주려면 9원이 필요합니다.
3개 부서보다 더 많은 부서의 물품을 구매해 줄 수는 없으므로 최대 3개 부서의 물품을 구매해 줄 수 있습니다.

입출력 예 #2
모든 부서의 물품을 구매해주면 10원이 됩니다. 따라서 최대 4개 부서의 물품을 구매해 줄 수 있습니다.

 

function solution(d, budget) {
    var answer = 0;
    
    d.sort((a, b) => a - b);
    
    for (let i = 0; i < d.length; i++) {
        if (budget - Number(d[i]) > 0) {
            answer++;
            budget = budget - Number(d[i]);
        } else if (budget - Number(d[i]) === 0) {
            answer++;
            budget = budget - Number(d[i]);
        }
    }
    
    return answer;
}

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

 

다른 사람의 풀이

function solution(d, budget) {
    d.sort((a, b) => a - b);

    while (d.reduce((a, b) => (a + b), 0) > budget) d.pop();

    return d.length;
}

반복할 때마다 reduce를 호출해서 검사하고 pop까지 해야해서 효율성이 떨어진다고 하지만 깔끔하네요 ㅎㅎ

 

또 다른 사람의 풀이

function solution(d, budget) {
    return ~(~d.sort((a,b)=>a-b).map(v => budget -= v).findIndex(v => v < 0) || ~d.length);
}

~ : 비트..?

 

비트 관련내용 보러가기

반응형
반응형

직사각형 별찍기

 

문제 설명
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

제한 조건
n과 m은 각각 1000 이하인 자연수입니다.
예시
입력

5 3


출력

*****
*****
*****

 

NodeJS에서 사용하는 내용? 인걸로 알고있습니다.

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);

    let str = "";
    
    for (let i = 0; i < b; i++) {
        for (let j = 1; j <= a; j++) {
            str += "*";
            if (j === a) str += "\n";
        }
    }
   
    console.log(str);
});

 

Javascript로 직사각형 만들기

function solution(a, b) {
  
  let str = "";

  for (let i = 0; i < b; i++) {
      for (let j = 1; j <= a; j++) {
          str += "*";
          if (j === a) str += "\n";
      }
  }

  return str;
}

console.log(solution(5, 3));
/*
*****
*****
*****
*/

 

다른 사람의 풀이

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    const row = '*'.repeat(a)
    for(let i =0; i < b; i++){
        console.log(row)
    }

});

repeat...!!

반응형
반응형

x만큼 간격이 있는 n개의 숫자

 

문제 설명
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

제한 조건
x는 -10000000 이상, 10000000 이하인 정수입니다.
n은 1000 이하인 자연수입니다.
입출력 예

x n answer
2 5 [2,4,6,8,10]
4 3 [4,8,12]
-4 2 [-4, -8]

 

function solution(x, n) {
    var answer = [];
    
    for (let i = 1; i <= n; i++) {
        answer.push(x * i)
    }
    
    return answer;
}

console.log(solution(2, 5)); // [2,4,6,8,10]
console.log(solution(4, 3)); // [4,8,12]
console.log(solution(-4, 2)); // [-4, -8]

 

다른 사람의 풀이

function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v)
}

깔끔하네요..!

Array() 생성자로 n개만큼의 길이를 가진 빈 슬롯을 만든다음, fill() 메서드로 배열을 x의 정적값으로 채워주고 map() 메서드로 인덱스에 1씩 더해준다음 정적값 x를 곱해준것 같습니다.

 

: 아직까지도 for반복문 이외에는 한번에 눈에 잘 들어오질 않는듯 합니다. ㅠ

반응형
반응형

행렬의 덧셈

 

문제 설명
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예

arr1 arr2 return
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]
[[1],[2]] [[3],[4]] [[4],[6]]

 

function solution(arr1, arr2) {
    var answer = [];

    for (let i = 0; i < arr1.length; i++) {
        answer.push(arr1[i].map((x, y) => arr1[i][y] + arr2[i][y]))
    }

    return answer;
}

console.log(solution([[1,2],[2,3]], [[3,4],[5,6]])); // [[4,6],[7,9]]
console.log(solution([[1],[2]], [[3],[4]])); // [[4],[6]]

for문과 map을 섞어서 만들어 봤습니다 !

 

다른 사람의 풀이

    const solution = (arr1, arr2) => arr1.reduce((acc, val, i) => [...acc, val.map((x, idx) => x + arr2[i][idx])], [])

WOW..

반응형
반응형

핸드폰 번호 가리기

 

문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
phone_number는 길이 4 이상, 20이하인 문자열입니다.
입출력 예

phone_number return
"01033334444" "*******4444"
"027778888" "*****8888"

 

function solution(phone_number) {
    var answer = '';
    let arr = phone_number.split("");
    let newArr = [];
    
    for (let i = 0; i < arr.length; i++) {
        if (i < arr.length - 4) {
            newArr.push("*");
        } else {
            newArr.push(arr[i]);
        }
    }
    
    answer = newArr.join("");
    
    return answer;
}

console.log(solution("01033334444")); // *******4444
console.log(solution("027778888")); // *****8888

 

다른 사람의 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function hide_numbers(s){
  return s.replace(/\d(?=\d{4})/g, "*");
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));

정규식..!

 

또 다른 사람의 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function hide_numbers(s){
    var result = "*".repeat(s.length - 4) + s.slice(-4);
    return result;
  }

  // 아래는 테스트로 출력해 보기 위한 코드입니다.
  console.log("결과 : " + hide_numbers('01033334444'));

횟수만큼 반복해주는 repeat() 메서드로 *를 생성해주고 나머지 뒤에 4자리를 슬라이스로 잘라서 갖다 붙여줬네요 !

옛날에 이렇게 비슷하게 비밀댓글을 만들었던 기억이...

:: 댓글중에 substr과의 차이를 자문자답해주신 분이 계셨는데 내용을 보니까 substr은 옛날 함수이기 때문에 사용하지 말고, substring과 slice중에 slice는 음수 지원이 가능하기 때문에 slice를 추천한다는 댓글 달아주셨네요 ( 이렇게 정보를 하나 알아갑니다 ㅎㅎ )

반응형
반응형

평균 구하기

 

문제 설명
정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

제한사항
arr은 길이 1 이상, 100 이하인 배열입니다.
arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.
입출력 예

arr return
[1,2,3,4] 2.5
[5,5] 5

 

function solution(arr) {
    var answer = 0;
    
    for (let i = 0; i < arr.length; i++) {
        answer += arr[i]
    }
    
    answer = answer / arr.length
    
    return answer;
}

console.log(solution([1,2,3,4])); // 2.5
console.log(solution([5,5])); // 5

 

다른 사람의 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function average(array){
  return array.reduce((a,b) => a+b) / array.length;
}


// 아래는 테스트로 출력해 보기 위한 코드입니다.
var testArray = [5,3,4] 
console.log("평균값 : " + average(testArray));

reduce() 메서드로 더해주니까 훨씬 깔끔해보이네요..!

하지만 배열의 길이가 길어질 수록 for반복문의 속도가 훨씬 빠르다고 하네요 !

 

반응형

+ Recent posts