kohigowild
221006 :: [프로그래머스] 없는 숫자 더하기 | 최댓값과 최솟값 | 다음 큰 숫자 본문
없는 숫자 더하기
👾 문제 설명
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 반환)
- 구글링 도중에 알게 된 건데 문제에 더욱 적합한 방법으로 보인다.
'Algorithm' 카테고리의 다른 글
221010 :: [프로그래머스] 영어 끝말잇기, 짝지어 제거하기, 3진법 뒤집기 (0) | 2022.10.10 |
---|---|
221007 :: [프로그래머스] 시저 암호 | 최소직사각형 | 구명보트 (0) | 2022.10.07 |
[프로그래머스] 체육복 (1) | 2022.10.06 |
[프로그래머스] 서울에서 김서방 찾기 (0) | 2022.10.06 |
[프로그래머스] 같은 숫자는 싫어 (0) | 2022.10.06 |