Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

kohigowild

221006 :: [프로그래머스] 없는 숫자 더하기 | 최댓값과 최솟값 | 다음 큰 숫자 본문

Algorithm

221006 :: [프로그래머스] 없는 숫자 더하기 | 최댓값과 최솟값 | 다음 큰 숫자

kohi ☕ 2022. 10. 6. 18:58
없는 숫자 더하기
👾 문제 설명

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

👾 제한사항

  • 1 ≤ numbers의 길이 ≤ 9
  • 0 ≤ numbers의 모든 원소 ≤ 9
  • numbers의 모든 원소는 서로 다릅니다.

 

👾 나의 답안

function solution(numbers) {
    let answer = 0;
    
    for (let i = 0; i < 10; i++) {
        if (!numbers.includes(i)) {
            answer += i;
        }
    } return answer;
}

 

  • .includes() 메서드를 사용해 배열에 없는 값을 변수 answer에 더한다.

 

👾 다른 사람의 풀이

function solution(numbers) {
    return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
}

 

  • 1부터 9까지 전체 합에서 reduce() 메서드로 입력된 배열의 값들을 뺀다. 여집합을 구하는 방식
  • 숫자 합이 컸다면 쓰기 어려워 보이지만 배열의 합이 간단한 문제에서는 코드 라인도 가장 간결하고 좋은 듯!

 


 

최댓값과 최솟값
👾 문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

👾 제한 조건

s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

 

👾 나의 코드

function solution(s) {
    const arr = s.split(" ");

    const max = Math.max.apply(null, arr);
    const min = Math.min.apply(null, arr);

    return `${min} ${max}`;
}

 

  • 문자열을 공백 기준으로 나눠서 배열 선언
  • 배열 중 최소값과 최대값 찾기
  • 다시 문자열로 리턴

 

👾 다른 사람의 풀이

function solution(s) {
    const arr = s.split(' ');

    return Math.min(...arr)+' '+Math.max(...arr);
}

 

  • 문자열에도 Math.max와 Math.min을 적용할 수 있다는 사실을 이 답을 보고 알게 되었다!

 


 

다음 큰 숫자

👾 문제 설명

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

  • 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
  • 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
  • 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.

예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.
자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

👾 제한 사항

  • n은 1,000,000 이하의 자연수 입니다.

 

👾 처음 제출한 답안

function solution(n) {
    let answer = n + 1;

    while (true) {
        answer++;

        let bin = n.toString(2).split("1").length;
        let nextBin = answer.toString(2).split("1").length;

        if (bin === nextBin) break;
    }
    return answer;
}

 

  • 조건 1에 맞춰 answer을 n보다 1이 큰 값으로 선언한다.
  • while 문 사용, 각각 answer과 n을 2진법 변환 + 1을 기준으로 split한 배열의 길이인 변수 bin, nextBin 선언
  • bin과 nextBin이 같으면 멈추고 반복문을 빠져나온다. 만약 1이 3개면 길이가 4인 배열이 반환된다.
  • 실행 결과 테스트 케이스 중 일부 오답이 출력되었다. 문법에 미숙해서 생긴 문제라고 생각이 들었다.

 

function solution(n) {
    let answer = n + 1;

    while (true) {
        let bin = n.toString(2).split("1").length;
        let nextBin = answer.toString(2).split("1").length;

        if (bin === nextBin) {
            break;
        }
        answer++;
    }
    return answer;
}

 

  • 구글링을 통해 답안을 약간 수정하였다. answer++; 을 if 문 뒤로 빼자 제대로 출력된다.

 

function solution(n) {
    let answer = n + 1;

    while (true) {
        let bin = n.toString(2).match(/1/g).length;
        let nextBin = answer.toString(2).match(/1/g).length;

        if (bin === nextBin) {
            break;
        }
        answer++;
    }
    return answer;
}

 

  • match() 메서드를 사용하면 찾고자 하는 단어와 일치하는 문자열을 담은 배열을 반환한다. (해당 문자열이 없을 경우 null 반환)
  • 구글링 도중에 알게 된 건데 문제에 더욱 적합한 방법으로 보인다.