221124 :: [프로그래머스] 제일 작은 수 제거하기, 이진 변환 반복하기, 카펫
제일 작은 수 제거하기
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
function solution(arr) {
let i = 0;
for (let j = 1; j < arr.length; j++) {
if (arr[j] < arr[i]) i = j;
}
arr.splice(i, 1);
return arr.length ? arr : [-1];
}
처음에 sort => pop 해서 답안 제출했다가 다 틀림.. 기존 배열 순서를 건드리면 그렇다고 한다
이진 변환 반복하기
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
- x의 모든 0을 제거합니다.
- x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
- s의 길이는 1 이상 150,000 이하입니다.
- s에는 '1'이 최소 하나 이상 포함되어 있습니다.
function solution(s) {
let result = [0, 0];
while (s !== "1") {
s = s.split("");
let temp = s.filter((v) => v === "1").length;
result[0]++;
result[1] += s.length - temp;
s = temp.toString(2);
}
return result;
}
s가 "1"이 될 때까지 반복
s를 배열로 쪼개서 1의 개수를 세고 result[0]++
result[1] 값에는 s.length - temp(s의 길이에서 1의 개수를 뺌, 0의 개수)를 더함
카펫
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
function solution(brown, yellow) {
// yellow + brown = w x h
// yellow = (w - 2) x (h - 2)
const area = brown + yellow;
for (let i = 3; i <= brown; i++) {
let r = 0;
let c = 0;
if (area % i === 0) {
r = area / i;
if ((i - 2) * (r - 2) === yellow) {
c = i;
return [r, c];
}
}
}
}