✅ check
findIndex
for문의 활용
Number.isInteger()
sort() 활용
indexOf()
문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.
my_string | result |
---|---|
"people" | "peol" |
"We are the world" | "We arthwold" |
const solution = (my_string) => {
let only = new Set(my_string)
return Array.from(only).join('')
}
function solution(my_string) {
// 임시 배열에 담을 필요 없이 전개 연산자로 바로 join 가능
return [...new Set(my_string)].join('');
}
머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.
morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
letter | result |
---|---|
".... . .-.. .-.. ---" | "hello" |
".--. -.-- - .... --- -." | "python" |
const solution = (letter) => {
let realLetter = '';
for( let a of letter.split(' ') ) {
for( let key of Object.keys(morse) ){
if( key === a ){
realLetter += morse[a]
}
}
}
return realLetter;
}
letter
를 공백을 기준으로 나누어 a
로 지정, morse
객체의 key
를 다시 뽑아서 비교해서 출력했다.
morse
객체의 key
를 따로 뽑지 않고 프로퍼티에 직접 접근(objectName[key]
)하여 map
을 활용하여 코드 길이도 줄이고 좀 더 직관적으로 풀이할 수 있다.
function solution(letter) {
return letter.split(' ').map(v=>morse[v]).join('');
}
외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.
emergency | result |
---|---|
[3, 76, 24] | [3, 1, 2] |
[1, 2, 3, 4, 5, 6, 7] | [7, 6, 5, 4, 3, 2, 1] |
[30, 10, 23, 6, 100] | [2, 4, 3, 5, 1] |
const solution = (emergency) => {
const priority = [...emergency].sort((a,b) => b-a );
return emergency.map((el) => {
for( let i = 0; i <= priority.length; i ++){
if( el === priority[i]){
return i+1;
}
}
})
}
function solution(emergency) {
let sort = [...emergency].sort((a, b) => b - a);
return emergency.map(k => {
const queue = sort.findIndex(v => v === k);
return queue + 1
});
}
📍
findIndex()
- 배열 요소를 순회하면서 인수로 전달된 콜백 함수를 호출하여 반환값이
true
인 첫 번째 요소의 인덱스 반환- 콜백 함수의 반환값이
true
인 요소가 존재하지 않으면 -1 반환
i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 4 3 2 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
n | result |
---|---|
3628800 | 10 |
7 | 3 |
const solution = (n) => {
let result = n;
let i = 1;
if (n === 1) return 1;
for( ; i <= result; i ++){
result /= i;
if( result === 1 ) return i ;
}
// result === 1 이 아닐 경우 for 문을 돌고 나온 i에 -1 함
return i -1;
}
function solution(n) {
for(let i = 1, v = 1; true; v *= ++i) if(v > n) return --i;
}
📍
for문
for(let i = 1, v = 1; true; v *= ++i)
- 초기화:
let i = 1, v = 1;
- i는 1부터 시작하고 v는 현재까지 계산된 팩토리얼 값을 저장
- 조건 부분:
true
- true는 항상 참이므로 무한 루프를 의미
- if문 내에서 명시적으로 루프를 종료할 때까지 반복
- 증감 부분:
v*= ++i
++1
: 먼저 1 증가시킨 후 증가된 값 사용v*=
현재v
에++i
를 곱한 값을 다시v
에 저장,- 루프 내용:
if(v > n) return --i;
v
가n
보다 커지면 루프를 종료return --i;
:i
를 1 감소시키고 반환( 마지막 v가 범위를 벗어나서 for문이 종료되었기 때문 )
문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
my_string | result |
---|---|
"aAb1B2cC34oOp" | 37 |
"1a2b3c4d123Z" | 133 |
const solution = (my_string) => {
let currentNum = 0;
let sum = 0;
for(let i = 0; i <= my_string.length; i ++){
let thisNum = my_string[i];
if( Number.isInteger(Number(thisNum)) ) {
currentNum = currentNum * 10 + Number(thisNum);
}else{
sum += currentNum;
currentNum = 0;
}
}
return sum;
}
📍
Number.isInteger()
- 인수로 전달된 숫자값이 정수( integer )인지 검사하여 그 결과를 불리언 값으로 반환
정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
array | n | result |
---|---|---|
[3, 10, 28] | 20 | 28 |
[10, 11, 12] | 13 | 12 |
const solution = (array, n) => {
let arr = [...array];
arr.push(n);
arr.sort((a,b) => a-b);
const num = arr.indexOf(n)
if( !arr[num+1]) return arr[num-1]
if( arr[num] - arr[num-1] < arr[num+1] - arr[num]){
return arr[num-1];
}
if( arr[num] - arr[num-1] === arr[num+1] - arr[num]){
return arr[num-1];
}
else return arr[num+1];
}
// Math.abs
function solution(array, n) {
array.sort((a,b) => Math.abs(n - a) - Math.abs(n - b) || a - b);
return array[0];
}
📍
array.sort((a, b) => Math.abs(n - a) - Math.abs(n - b) || a - b);
- 기본 비교 조건:
Math.abs(n - a) - Math.abs(n - b)
- 각 원소 a와 b가 주어진 n과 얼마나 가까운 지를 기준으로 정렬
- Math.abs(n - a): a와 n의 절대값 차이
- Math.abs(n - b): b와 n의 절대값 차이
- 절대값 차이의 차이가 양수이면 b가 n에 더 가깝고, 음수이면 a가 n에 더 가까움
- 보조 비교 조건:
|| a - b
- 기본 비교 조건의 값이 동일할 경우 실행
- 기본 조건이 같을 때는 값 자체로 정렬
문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
A | B | result |
---|---|---|
"hello" | "ohell" | 1 |
"apple" | "elppa" | -1 |
"atat" | "tata" | 1 |
"abc" | "abc" | 0 |
const solution = (A, B) => {
const arrA = [...A]
const arrB = [...B];
let num = 0;
if( A === B ) return 0;
for (let i = 1; i <= arrA.length; i++){
arrA.unshift(arrA.pop())
if( arrA.join('') === arrB.join('')) {
num = i;
break;
}
}
return num === 0 ? -1 : num
}
let solution=(a,b)=>(b+b).indexOf(a)
(b+b)
: 문자열 두 배로 이어붙여서 모든 회전 가능성을 가진 문자열을 만듬.indexOf(a)
: 해당하는 문자열의 인덱스를 반환하는 방법으로 회전 수를 찾음📍
indexOf()
- 배열에 특정 요소가 존재하는지 확인할 때 유용한 메서드
- 원본 배열에 인수로 전달한 요소와 중복되는 요소가 여러 개 있다면 첫 번째로 검색된 요소의 인덱스 반환
- 원본 배열에 인수로 전달한 요소가 존재하지 않으면 -1 반환