문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
제한사항
입출력 예
arr | answer |
---|---|
[1,1,3,3,0,1,1] | [1,3,0,1] |
[4,4,4,3,3] | [4,3] |
입출력 예 설명
입출력 예 #1,2
문제의 예시와 같습니다.
function solution(arr) {
let answer = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== arr[i+1]) {
answer.push(arr[i]);
}
}
return answer;
}
function solution(arr) {
return arr.filter((x, i) => x !== arr[i+1])
}
filter() method
는 함수에 의해 제공된 테스트를 통과하는 요소로 채워진 새 배열을 만듭니다.
filter() method
는 빈 요소에 대해 함수를 실행하지 않습니다.
filter() method
는 원본 배열을 변화시키지 않습니다.
syntax
array.filter(function(currentValue, index, arr), thisValue)
Parameters
Parameter | Description |
---|---|
function() | Required. 각 배열 요소에 대해 실행할 함수입니다. |
currentValue | Required. 현재 요소의 value 입니다. |
index | Optional. 현재 요소의 index입니다. |
arr | Optional. 현재 요소의 배열입니다. |
thisValue | Optional. Default undefined. this 값으로 함수에 전달된 값입니다. |
Return Value
Type | Description |
---|---|
An array | 테스트를 통과한 요소를 포함합니다. 테스트를 통과한 요소가 없으면 빈 배열을 반환합니다. |
문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
제한 사항
입출력 예
s | return |
---|---|
"try hello world" | "TrY HeLlO WoRlD" |
입출력 예 설명
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.
function solution(s) {
let arr = s.split(' ');
let result = '';
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j++) {
if(j % 2 === 1) {
result += arr[i][j].toLowerCase();
} else {
result += arr[i][j].toUpperCase();
}
}
if (i < arr.length - 1) {
result += ' ';
}
} return result;
}
i < arr.length - 1
조건에 arr 배열의 끝이 더해질 땐 띄어쓰기가 될 수 있도록 result 에 추가한다.function solution(s) {
return s.split(' ').map(i => i.split('').map((j, index) => index % 2 === 0 ? j.toUpperCase() : j.toLowerCase()).join('')).join(' ')
}
s.split(' ')
로 나눠진 배열요소들을 또 split 하여 map을 사용한다..join(' ')
로 설정해준다.문제 설명
S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.
물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.
부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.
제한사항
입출력 예
d | budget |
---|---|
[1,3,2,5,4] | 9 |
[2,2,3,3] | 10 |
입출력 예 설명
입출력 예 #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) {
let answer = 0;
let sortArr = d.sort((a, b) => a - b);
for (let i = 0; i < sortArr.length; i++) {
if (sortArr[i] <= budget) {
budget -= sortArr[i];
answer += 1;
}
}
return answer;
}
위처럼 진행시 sort()
라고만 작성하니 오류가 발생되었다. 숫자를 정렬할 때는 sort((a, b) => a - b)
라고 정확히 명시해야하는 것을 알았다.
By default, sort() 함수는 문자열의 값을 정렬합니다.
문자열에서는 잘 작동합니다. ("Apple" comes before "Banana").
그러나, 만약 숫자가 문자열로써 정렬된다면 1보다 2가 크기 때문에 "25"는 "100"보다 큽니다.
이러한 이유로 sort() method 는 숫자를 정렬할 때 부정확한 결과를 출력하게 됩니다.
function solution(d, budget) {
d.sort((a, b) => a - b);
while (d.reduce((a, b) => (a + b), 0) > budget) {
d.pop();
}
return d.length;
}
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한 조건
입출력 예
s | n | result |
---|---|---|
"AB" | 1 | "BC" |
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
어떻게 풀어야하는지 감은 잡았으나 코드로 작성하려니 쉽지 않았다... 많은 고민을 했지만 포기를 하고 다른 풀이를 보게 되었다...
function solution(s, n) {
return s.split("").map(x => {
if (x === ' ') {
return x;
};
return x.toUpperCase().charCodeAt() + n > 90 ? String.fromCharCode(x.charCodeAt() + n - 26) : String.fromCharCode(x.charCodeAt() + n);
}).join('')
}
위의 코드 처럼 unicode 를 사용하는 방법이 있었고 n의 숫자가 1이상 25이하의 자연수이므로 a부터 z까지 두 번 작성하여 푸는 방법도 있었다.
unicode를 사용하는 방법이 있다는 것을 알게 되었다.
비밀지도
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
n
인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.1
, 공백 부분을 0
으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력 형식
입력으로 지도의 한 변 크기 n
과 2개의 정수 배열 arr1
, arr2
가 들어온다.
n
≦ 16arr1
, arr2
는 길이 n
인 정수 배열로 주어진다.x
를 이진수로 변환했을 때의 길이는 n
이하이다. 즉, 0 ≦ x
≦ 2n - 1을 만족한다.출력 형식
원래의 비밀지도를 해독하여 '#'
, 공백
으로 구성된 문자열 배열로 출력하라.
입출력 예제
매개변수 | 값 |
---|---|
n | 5 |
arr1 | [9, 20, 28, 18, 11] |
arr2 | [30, 1, 21, 17, 28] |
출력 | ["#####","# # #", "### #", "# ##", "#####"] |
매개변수 | 값 |
---|---|
n | 6 |
arr1 | [46, 33, 33 ,22, 31, 50] |
arr2 | [27 ,56, 19, 14, 14, 10] |
출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
function solution(n, arr1, arr2) {
let answer = [];
let a = arr1.map(x => x.toString(2).padStart(n, '0'));
let b = arr2.map(x => x.toString(2).padStart(n, '0'));
for(let i = 0; i < n; i++) {
let hashTag = '';
for(let j = 0; j < n; j++) {
a[i][j] === '0' && b[i][j] === '0' ? hashTag += ' ' : hashTag += '#';
}
answer.push(hashTag);
}
return answer;
};
문제 설명
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.
명함 번호 | 가로 길이 | 세로 길이 |
---|---|---|
1 | 60 | 50 |
2 | 30 | 70 |
3 | 60 | 30 |
4 | 80 | 40 |
가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.
모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.
제한사항
입출력 예
sizes | result |
---|---|
[[60, 50], [30, 70], [60, 30], [80, 40]] | 4000 |
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] | 120 |
[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] | 133 |
입출력 예 설명
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
명함들을 적절히 회전시켜 겹쳤을 때, 3번째 명함(가로: 8, 세로: 15)이 다른 모든 명함보다 크기가 큽니다. 따라서 지갑의 크기는 3번째 명함의 크기와 같으며, 120(=8 x 15)을 return 합니다.
입출력 예 #3
명함들을 적절히 회전시켜 겹쳤을 때, 모든 명함을 포함하는 가장 작은 지갑의 크기는 133(=19 x 7)입니다.
function solution(sizes) {
let x = sizes.map((a) => a.sort((a, b) => a - b));
let a = [];
let b = [];
for (let i = 0; i < x.length; i++) {
a.push(x[i][0]);
b.push(x[i][1]);
}
return Math.max(...a) * Math.max(...b);
}
명함 번호의 가로길이와 세로길이를 정렬하여 작은 수를 가로길이에 넣고 큰 수를 세로길이에 넣어 가로 길이 중 가장 큰 수와 세로 길이의 가장 큰 수를 곱하면 원하는 값이 나올 수 있을거라고 생각했다.
reference
https://school.programmers.co.kr/
https://www.w3schools.com/jsref/jsref_filter.asp
https://www.w3schools.com/js/js_array_sort.asp