programmers
프로그래머스 문제풀이 모음
# Level 0. 직사각형 넓이 구하기
직사각형 넓이 구하기
문제 설명
2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.
제한사항
dots의 길이 = 4
dots의 원소의 길이 = 2
-256 < dots[i]의 원소 < 256
잘못된 입력은 주어지지 않습니다.
문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function solution ( dots ) {
let width = 0 ;
let height = 0 ;
for ( let i = 1 ; i < 4 ; i ++ ) {
if ( dots [ i ][ 0 ] === dots [ 0 ][ 0 ]) {
height = Math . abs ( dots [ i ][ 1 ] - dots [ 0 ][ 1 ]);
continue ;
}
if ( dots [ i ][ 1 ] === dots [ 0 ][ 1 ]) {
width = Math . abs ( dots [ i ][ 0 ] - dots [ 0 ][ 0 ]);
}
}
return width * height ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function solution ( dots ) {
let width = 0 ;
let height = 0 ;
for ( let i = 1 ; i < 4 ; i ++ ) {
if ( dots [ i ][ 0 ] === dots [ 0 ][ 0 ]) {
height = Math . abs ( dots [ i ][ 1 ] - dots [ 0 ][ 1 ]);
continue ;
}
if ( dots [ i ][ 1 ] === dots [ 0 ][ 1 ]) {
width = Math . abs ( dots [ i ][ 0 ] - dots [ 0 ][ 0 ]);
}
}
return width * height ;
}
리팩토링
1
2
3
4
5
6
7
8
9
10
11
12
13 function solution ( dots ) {
const [ benchmarkX , benchmarkY ] = dots [ 0 ];
let width = 0 ;
let height = 0 ;
dots . forEach (([ x , y ], index ) => {
if ( index === 0 ) return ;
if ( ! height && x === benchmarkX ) height = Math . abs ( benchmarkY - y );
if ( ! width && y === benchmarkY ) width = Math . abs ( benchmarkX - x );
});
return width * height ;
}
# Level 0. 다항식 더하기
다항식 더하기
문제 설명
한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.
제한사항
0 < polynomial에 있는 수 < 100
polynomial에 변수는 ‘x’만 존재합니다.
polynomial은 0부터 9까지의 정수, 공백, ‘x’, ‘+’로 이루어져 있습니다.
항과 연산기호 사이에는 항상 공백이 존재합니다.
공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
” + 3xx + + x7 + “와 같은 잘못된 입력은 주어지지 않습니다.
“012x + 001”처럼 0을 제외하고는 0으로 시작하는 수는 없습니다.
문자와 숫자 사이의 곱하기는 생략합니다.
polynomial에는 일차 항과 상수항만 존재합니다.
계수 1은 생략합니다.
결괏값에 상수항은 마지막에 둡니다.
0 < polynomial의 길이 < 50
문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 function solution ( polynomial ) {
const answer = [ 0 , 0 ];
const splitted = polynomial . split ( " + " );
if ( splitted . length === 1 ) return polynomial ;
splitted . forEach (( term ) => {
if ( term [ term . length - 1 ] !== "x" ) {
answer [ 1 ] += term * 1 ;
return ;
}
answer [ 0 ] += term === "x" ? 1 : term . slice ( 0 , term . length - 1 ) * 1 ;
});
if ( answer [ 0 ] === 1 ) answer [ 0 ] = "" ;
answer [ 0 ] += "x" ;
if ( answer [ 0 ] === "0x" ) answer . shift ();
if ( answer [ 1 ] === 0 ) answer . pop ();
return answer . join ( " + " );
}
리팩토링
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
31
32
33
34
35
36 const filterPolynomial = ( polynomialStr ) => {
const validTerm = new RegExp ( "[0-9]*x|[0-9]+" , "g" );
return polynomialStr . match ( validTerm );
};
const getPolynomialResult = ( polynomialArr ) => {
const result = [ 0 , 0 ];
polynomialArr . forEach (( term ) => {
if ( term [ term . length - 1 ] !== "x" ) {
result [ 1 ] += parseInt ( term );
return ;
}
result [ 0 ] += term === "x" ? 1 : parseInt ( term );
});
return result ;
};
const formatPolynomial = ( xNumber , constant ) => {
if ( ! xNumber ) return [ constant ];
const result = [];
xNumber === 1 ? result . push ( "x" ) : result . push ( ` $ { xNumber } x ` );
if ( constant ) result . push ( constant );
return result ;
};
function solution ( polynomial ) {
const filtered = filterPolynomial ( polynomial );
const [ x , constant ] = getPolynomialResult ( filtered );
const answer = formatPolynomial ( x , constant );
return answer . join ( " + " );
}
두번째 리팩토링
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 function solution ( polynomial ) {
const answer = [ 0 , 0 ];
const splitted = polynomial . split ( " + " );
if ( splitted . length === 1 ) return polynomial ;
splitted . forEach (( term ) => {
let index = 0 ;
if ( term [ term . length - 1 ] !== "x" ) index = 1 ;
answer [ index ] += term === "x" ? 1 : parseInt ( term );
});
if ( ! answer [ 0 ]) return ` $ { answer [ 1 ]} ` ;
if ( ! answer [ 1 ]) answer . pop ();
answer [ 0 ] === 1 ? ( answer [ 0 ] = "x" ) : ( answer [ 0 ] += "x" );
return answer . join ( " + " );
}
# Level 0. 7의 개수
7의 개수
문제 설명
머쓱이는 행운의 숫자 7을 가장 좋아합니다. 정수 배열 array가 매개변수로 주어질 때, 7이 총 몇 개 있는지 return 하도록 solution 함수를 완성해보세요.
제한사항
1 ≤ array의 길이 ≤ 100
0 ≤ array의 원소 ≤ 100,000
문제 풀이
1
2
3
4
5
6
7
8
9
10 function solution ( array ) {
let answer = 0 ;
array . forEach (( num ) => {
while ( num ) {
if ( num % 10 === 7 ) answer ++ ;
num = Math . floor ( num / 10 );
}
});
return answer ;
}
요구사항대로 풀이함.
수의 위치에 대한 요구사항이 없었기 때문에 나누기와 나머지로 풀이함.
# Level 0. 최댓값 만들기 (2)
최댓값 만들기 (2)
문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
-10,000 ≤ numbers의 원소 ≤ 10,000
2 ≤ numbers 의 길이 ≤ 100
문제풀이
1
2
3
4
5
6
7
8
9 function solution ( numbers ) {
let max = - Infinity ;
for ( let i = 0 ; i < numbers . length ; i ++ ) {
for ( let j = i + 1 ; j < numbers . length ; j ++ ) {
if ( max < numbers [ i ] * numbers [ j ]) max = numbers [ i ] * numbers [ j ];
}
}
return max ;
}
시간복잡도를 개선시킬 수 있는 방법이 없을까?
# Level 0. 잘라서 배열로 저장하기
잘라서 배열로 저장하기
문제 설명
문자열 my_str과 n이 매개변수로 주어질 때, my_str을 길이 n씩 잘라서 저장한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_str의 길이 ≤ 100
1 ≤ n ≤ my_str의 길이
my_str은 알파벳 소문자, 대문자, 숫자로 이루어져 있습니다.
문제풀이
1
2
3
4
5
6
7
8
9 function solution ( my_str , n ) {
const answer = [];
let index = 0 ;
while ( index < my_str . length ) {
answer . push ( my_str . slice ( index , index + n ));
index += n ;
}
return answer ;
}
# Level 0. 캐릭터의 좌표
캐릭터의 좌표
문제 설명
머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.
[0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.
제한사항
board은 [가로 크기, 세로 크기] 형태로 주어집니다.
board의 가로 크기와 세로 크기는 홀수입니다.
board의 크기를 벗어난 방향키 입력은 무시합니다.
0 ≤ keyinput의 길이 ≤ 50
1 ≤ board[0] ≤ 99
1 ≤ board[1] ≤ 99
keyinput은 항상 up, down, left, right만 주어집니다.
문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 function solution ( keyinput , board ) {
const character = [ 0 , 0 ];
const halfWidth = ( board [ 0 ] - 1 ) / 2 ;
const halfHeigth = ( board [ 1 ] - 1 ) / 2 ;
keyinput . forEach (( key ) => {
switch ( key ) {
case "left" :
if ( character [ 0 ] > - halfWidth ) character [ 0 ] -- ;
break ;
case "right" :
if ( character [ 0 ] < halfWidth ) character [ 0 ] ++ ;
break ;
case "down" :
if ( character [ 1 ] > - halfHeigth ) character [ 1 ] -- ;
break ;
case "up" :
if ( character [ 1 ] < halfHeigth ) character [ 1 ] ++ ;
break ;
}
});
return character ;
}
# Level 0. 문자열안에 문자열
문자열안에 문자열
문제 설명
문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ str1의 길이 ≤ 100
1 ≤ str2의 길이 ≤ 100
문제 풀이
1
2
3
4 function solution ( str1 , str2 ) {
const strRegExp = new RegExp ( str2 );
return strRegExp . test ( str1 ) ? 1 : 2 ;
}
# Level 0. 문자열 정렬하기 (2)
문자열 정렬하기 (2)
문제 설명
영어 대소문자로 이루어진 문자열 my_string이 매개변수로 주어질 때, my_string을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요.
제한사항
문제풀이
1
2
3 function solution ( my_string ) {
return my_string . toLowerCase (). split ( "" ). sort (). join ( "" );
}
# Level 0. OX퀴즈
OX퀴즈
문제 설명
덧셈, 뺄셈 수식들이 ‘X [연산자] Y = Z’ 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다. 수식이 옳다면 “O”를 틀리다면 “X”를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
연산 기호와 숫자 사이는 항상 하나의 공백이 존재합니다. 단 음수를 표시하는 마이너스 기호와 숫자 사이에는 공백이 존재하지 않습니다.
1 ≤ quiz의 길이 ≤ 10
X, Y, Z는 각각 0부터 9까지 숫자로 이루어진 정수를 의미하며, 각 숫자의 맨 앞에 마이너스 기호가 하나 있을 수 있고 이는 음수를 의미합니다.
X, Y, Z는 0을 제외하고는 0으로 시작하지 않습니다.
-10,000 ≤ X, Y ≤ 10,000
-20,000 ≤ Z ≤ 20,000
[연산자]는 + 와 - 중 하나입니다.
문제풀이
1
2
3
4
5
6
7
8
9
10
11 const getExpressionResult = ( expression ) => {
const [ X , operator , Y , _ , Z ] = expression . split ( " " );
let result = X * 1 ;
result += operator === "+" ? Y * 1 : Y * - 1 ;
return result === Z * 1 ? "O" : "X" ;
};
const solution = ( quiz ) => {
const answer = quiz . map (( expression ) => getExpressionResult ( expression ));
return answer ;
};
# Level 0. n의 배수 고르기
n의 배수 고르기
문제 설명
정수 n과 정수 배열 numlist가 매개변수로 주어질 때, numlist에서 n의 배수가 아닌 수들을 제거한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ n ≤ 10,000
1 ≤ numlist의 크기 ≤ 100
1 ≤ numlist의 원소 ≤ 100,000
문제 풀이
1
2
3 function solution ( n , numlist ) {
return numlist . filter (( num ) => ! ( num % n ));
}
요구사항대로 풀이함.
자바스크립트의 암묵적 타입변환을 이용함.
두번째 문제 풀이
1
2
3
4
5
6 function solution ( n , numlist ) {
return numlist . filter (( num ) => {
if ( num % n === 0 ) return true ;
return false ;
});
}
# Level 0. 숫자 찾기
숫자 찾기
문제 설명
정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
제한사항
0 < num < 1,000,000
0 ≤ k < 10
num에 k가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다.
첫번째 문제 풀이
1
2
3
4
5
6 function solution ( num , k ) {
const numArr = num . toString (). split ( "" );
const strK = k . toString ();
if ( numArr . includes ( strK )) return numArr . indexOf ( strK ) + 1 ;
return - 1 ;
}
두번째 문제 풀이
1
2
3
4
5
6
7
8
9
10
11 function solution ( num , k ) {
let index = 0 ;
const length = num . toString (). length ;
let answer = - 1 ;
while ( num ) {
if ( num % 10 === k ) answer = length - index ;
num = Math . floor ( num / 10 );
index ++ ;
}
return answer ;
}
요구사항대로 구현하되 배열이 아닌 숫자의 성질을 이용해서 풀이함.
# Level 0. 세균 증식
세균 증식
문제 설명
어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.
제한사항
문제풀이
1
2
3 function solution ( n , t ) {
return n * Math . pow ( 2 , t );
}
# Level 0. 한 번만 등장한 문자
한 번만 등장한 문자
문제 설명
문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.
제한사항
0 < s의 길이 < 1,000
s는 소문자로만 이루어져 있습니다.
문제 풀이
1
2
3
4
5
6
7
8
9
10
11 function solution ( s ) {
let answer = "" ;
const countArray = new Array ( 32 ). fill ( 0 );
for ( let i = 0 ; i < s . length ; i ++ ) {
countArray [ s . charCodeAt ( i ) - 97 ] ++ ;
}
countArray . forEach (( count , index ) => {
if ( count === 1 ) answer += String . fromCharCode ( index + 97 );
});
return answer ;
}
한 번만 등장하는 문자를 찾는다.
사전순으로 정렬한다.
계수배열과 알파벳 맵 둘 다 O(N)의 시간복잡도를 가지지만, 알파벳 맵은 알파벳 맵을 따로 만들어야하기에 계수배열로 풀이했다.
# Level 0. 가장 큰 수 찾기
가장 큰 수 찾기
문제 설명
정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
1 ≤ array의 길이 ≤ 100
0 ≤ array 원소 ≤ 1,000
array에 중복된 숫자는 없습니다.
문제 풀이
1
2
3
4 function solution ( array ) {
const max = Math . max (... array );
return [ max , array . indexOf ( max )];
}
# Level 0. 약수 구하기
약수 구하기
문제 설명
정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13 function solution ( n ) {
const answer = [];
for ( let i = 1 ; i <= Math . sqrt ( n ); i ++ ) {
if ( n % i === 0 ) {
answer . push ( i );
if ( n / i === i ) continue ;
answer . push ( n / i );
}
}
return answer . sort (( a , b ) => a - b );
}
# Level 0. 문자열 계산하기
문자열 계산하기
문제 설명
my_string은 “3 + 5”처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.
제한사항
연산자는 +, -만 존재합니다.
문자열의 시작과 끝에는 공백이 없습니다.
0으로 시작하는 숫자는 주어지지 않습니다.
잘못된 수식은 주어지지 않습니다.
5 ≤ my_string의 길이 ≤ 100
my_string을 계산한 결과값은 1 이상 100,000 이하입니다.
my_string의 중간 계산 값은 -100,000 이상 100,- 000 이하입니다.
계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.
my_string에는 연산자가 적어도 하나 포함되어 있습니다.
return type 은 정수형입니다.
my_string의 숫자와 연산자는 공백 하나로 - 구분되어 있습니다.
문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12 function solution ( my_string ) {
const splitted = my_string . split ( " " );
let answer = parseInt ( splitted [ 0 ]);
for ( let i = 1 ; i < splitted . length ; i += 2 ) {
if ( splitted [ i ] === "+" ) {
answer += parseInt ( splitted [ i + 1 ]);
} else if ( splitted [ i ] === "-" ) {
answer -= parseInt ( splitted [ i + 1 ]);
}
}
return answer ;
}
# Level 0. 배열의 유사도
배열의 유사도
문제 설명
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ s1, s2의 길이 ≤ 100
1 ≤ s1, s2의 원소의 길이 ≤ 10
s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
s1과 s2는 각각 중복된 원소를 갖지 않습니다.
문제 풀이
1
2
3
4 function solution ( s1 , s2 ) {
const similarity = s1 . filter (( char ) => s2 . includes ( char )). length ;
return similarity ;
}
# Level 0. 영어가 싫어요
영어가 싫어요
문제 설명
영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.
제한사항
numbers는 소문자로만 구성되어 있습니다.
numbers는 “zero”, “one”, “two”, “three”, “four”, “five”, “six”, “seven”, “eight”, “nine” 들이 공백 없이 조합되어 있습니다.
1 ≤ numbers의 길이 ≤ 50
“zero”는 numbers의 맨 앞에 올 수 없습니다.
문제 풀이
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 const numberMap = {
zero : "0" ,
one : "1" ,
two : "2" ,
three : "3" ,
four : "4" ,
five : "5" ,
six : "6" ,
seven : "7" ,
eight : "8" ,
nine : "9" ,
};
function solution ( numbers ) {
let answer = "" ;
let searchWord = "" ;
for ( let i = 0 ; i < numbers . length ; i ++ ) {
searchWord += numbers [ i ];
if ( numberMap [ searchWord ]) {
answer += numberMap [ searchWord ];
searchWord = "" ;
}
}
return answer * 1 ;
}
# Level 0. 인덱스 바꾸기
인덱스 바꾸기
문제 설명
문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
제한사항
1 < my_string의 길이 < 100
0 ≤ num1, num2 < my_string의 길이
my_string은 소문자로 이루어져 있습니다.
num1 ≠ num2
문제 풀이
1
2
3
4
5
6
7
8 function solution ( my_string , num1 , num2 ) {
my_string = my_string . split ( "" );
let temp = "" ;
temp = my_string [ num1 ];
my_string [ num1 ] = my_string [ num2 ];
my_string [ num2 ] = temp ;
return my_string . join ( "" );
}
더 나은 풀이
1
2
3
4
5 function solution ( my_string , num1 , num2 ) {
my_string = my_string . split ( "" );
[ my_string [ num1 ], my_string [ num2 ]] = [ my_string [ num2 ], my_string [ num1 ]];
return my_string . join ( "" );
}
# Level 0. 대문자와 소문자
대문자와 소문자
문제 설명
문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string의 길이 ≤ 1,000
my_string은 영어 대문자와 소문자로만 구성되어 있습니다.
문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12 function solution ( my_string ) {
let answer = "" ;
for ( let i = 0 ; i < my_string . length ; i ++ ) {
const asciiNum = my_string [ i ]. charCodeAt ();
if ( asciiNum <= 90 ) {
answer += String . fromCharCode ( asciiNum + 32 );
} else {
answer += String . fromCharCode ( asciiNum - 32 );
}
}
return answer ;
}
요구사항대로 구현함.
정규표현식과 아스키코드 사이에서 고민했으나 정규표현식을 사용하면 직관적일 수 있으나, 아스키코드가 성능상으로 낫다고 판단하였음.
# Level 0. 배열 원소의 길이
배열 원소의 길이
문제 설명
문자열 배열 strlist가 매개변수로 주어집니다. strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ strlist 원소의 길이 ≤ 100
strlist는 알파벳 소문자, 대문자, 특수문자로 구성되어 있습니다.
문제 풀이
1
2
3 function solution ( strlist ) {
return strlist . map (( str ) => str . length );
}
# Level 0. 삼각형의 완성 조건 (1)
삼각형의 완성조건 (1)
문제 설명
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
sides의 원소는 자연수입니다.
sides의 길이는 3입니다.
1 ≤ sides의 원소 ≤ 1,000
문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12 function solution ( sides ) {
const max = Math . max (... sides );
const maxIndex = sides . indexOf ( max );
const answer =
sides . reduce (( acc , curr , index ) => {
if ( index === maxIndex ) return acc ;
return acc + curr ;
}) > max
? 1
: 2 ;
return answer ;
}
요구사항대로 구현함.
최대값과 최대 값의 위치를 찾고, 나머지를 더하여 비교한 결과를 반환함.
배열의 길이가 3 밖에 되지 않으니 그냥 일일히 비교하는게 직관적이고 간단할 수는 있으나, 소프트웨어와 어울리지 않아서 이와 같이 풀이함.
# Level 0. 중복된 문자 제거
중복된 문자 제거
문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string ≤ 110
my_string은 대문자, 소문자, 공백으로 - 구성되어 있습니다.
대문자와 소문자를 구분합니다.
공백(“ “)도 하나의 문자로 구분합니다.
중복된 문자 중 가장 앞에 있는 문자를 남깁니다.
문제 풀이
1
2
3 function solution ( my_string ) {
return [... new Set ( my_string . split ( "" ))]. join ( "" );
}
# Level 0. 암호 해독
암호 해독
문제 설명
군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.
암호화된 문자열 cipher를 주고받습니다.
그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ cipher의 길이 ≤ 1,000
1 ≤ code ≤ cipher의 길이
cipher는 소문자와 공백으로만 구성되어 있습니다.
공백도 하나의 문자로 취급합니다.
문제 풀이
1
2
3
4
5
6
7 function solution ( cipher , code ) {
let answer = "" ;
for ( let i = 0 ; i < cipher . length ; i ++ ) {
if (( i + 1 ) % code === 0 ) answer += cipher [ i ];
}
return answer ;
}
요구사항대로 구현함.
cipher에 split을 사용하고 forEach를 사용하는 방법도 있었으나, 이정도의 문제 풀이에서 그정도의 순수성을 지키지는 않아도 된다고 판단했음.
# Level 0. 가까운 수
가까운 수
문제 설명
정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ array의 길이 ≤ 100
1 ≤ array의 원소 ≤ 100
1 ≤ n ≤ 100
가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.
문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function solution ( array , n ) {
let closest ;
let gap = Infinity ;
array . forEach (( num ) => {
const currGap = Math . abs ( num - n );
if ( currGap < gap ) {
closest = num ;
gap = currGap ;
} else if ( currGap === gap && num < closest ) {
closest = num ;
}
});
return closest ;
}
# Level 0. 369게임
369게임
문제 설명
머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.
제한사항
문제 풀이
1
2
3 function solution ( order ) {
return order . toString (). match ( /3|6|9/g )?. length || 0 ;
}
요구사항대로 풀이함.
3, 6, 9가 없을 경우를 사용하여 옵셔널 체이닝 사용함.
# Level 0. 문자열 정렬하기 (1)
문자열 정렬하기 (1)
문제 설명
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.
제한사항
1 ≤ my_string의 길이 ≤ 100
my_string에는 숫자가 한 개 이상 포함되어 있습니다.
my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루어져 있습니다.
문제 풀이
1
2
3
4 function solution ( my_string ) {
const numbers = my_string . match ( / [ 0-9 ] /g ). map (( num ) => num * 1 );
return numbers . sort (( a , b ) => a - b );
}
요구사항대로 구현함.
문자열 중 숫자 탐색을 여러가지 방법으로 구현할 수 있었으나, 제한사항이 적기 때문에 구현이 가장 쉽고 용이한 정규표현식을 이용하였음.
정렬도 마찬가지로 내장 sort 메서드를 사용함.
# Level 0. 숨어있는 숫자의 덧셈 (1)
숨어있는 숫자의 덧셈 (1)
문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string의 길이 ≤ 1,000
my_string은 소문자, 대문자 그리고 한자리 자연수로만 구성되어있습니다.
문제 풀이
1
2
3
4
5 function solution ( my_string ) {
const numbers = my_string . match ( / [ 0-9 ] /g ). map (( num ) => num * 1 );
const sum = numbers . reduce (( acc , curr ) => acc + curr );
return sum ;
}
# Level 0. 소인수분해
소인수분해
문제 설명
소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 _ 2 _ 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
첫번째 풀이
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
31
32 const checkIsPrime = ( number ) => {
for ( let j = 2 ; j <= Math . floor ( Math . sqrt ( number )); j ++ ) {
if ( number % j === 0 && number !== j ) return false ;
}
return true ;
};
const getPrimesUnderNumber = ( limitNumber ) => {
const primes = [ 2 ];
for ( let i = 3 ; i <= limitNumber ; i ++ ) {
checkIsPrime ( i ) && primes . push ( i );
}
return primes ;
};
const solution = ( n ) => {
const answer = [];
const primes = getPrimesUnderNumber ( n );
let index = 0 ;
while ( primes [ index ] <= n ) {
if ( n % primes [ index ] === 0 ) {
answer . push ( primes [ index ]);
}
index ++ ;
}
return answer ;
};
소수를 구한 뒤, 소수를 순회하며 n이 소수로 나눠지는지 확인하는 방법이다.
# Level 0. 모음 제거
모음 제거
문제 설명
영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
my_string은 소문자와 공백으로 이루어져 있습니다.
1 ≤ my_string의 길이 ≤ 1,000
문제 풀이
1
2
3
4
5
6
7 function solution ( my_string ) {
const vowel = [ "a" , "e" , "i" , "o" , "u" ];
return my_string
. split ( "" )
. filter (( char ) => ! vowel . includes ( char ))
. join ( "" );
}
# Level 0. 컨트롤 제트
컨트롤 제트
문제 설명
숫자와 “Z”가 공백으로 구분되어 담긴 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 “Z”가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 “Z”로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.
제한사항
1 ≤ s의 길이 ≤ 200
-1,000 < s의 원소 중 숫자 < 1,000
s는 숫자, “Z”, 공백으로 이루어져 있습니다.
s에 있는 숫자와 “Z”는 서로 공백으로 구분됩니다.
연속된 공백은 주어지지 않습니다.
0을 제외하고는 0으로 시작하는 숫자는 없습니다.
s는 “Z”로 시작하지 않습니다.
s의 시작과 끝에는 공백이 없습니다.
“Z”가 연속해서 나오는 경우는 없습니다.
문제 풀이
1
2
3
4
5
6
7
8
9
10
11 function solution ( s ) {
let answer = 0 ;
s = s . split ( " " );
s . forEach (( num , index ) => {
if ( index === 0 ) return ;
if (( num === "Z" ) | ( s [ index - 1 ] === "Z" )) return ;
answer += s [ index - 1 ] * 1 ;
});
answer += s [ s . length - 1 ] !== "Z" ? s [ s . length - 1 ] * 1 : 0 ;
return answer ;
}
수를 더했다가 빼주는 것보다, 그 다음번 index가 Z인지 확인하면 연산을 줄일 수 있을거라고 판단함.
forEach 문에서 return을 사용해서 for문의 continue를 대체함.
# Level 0. 공 던지기
공 던지기
문제 설명
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
제한사항
2 < numbers의 길이 < 100
0 < k < 1,000
numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.
풀이
1
2
3
4
5 const solution = ( numbers , k ) => {
const passedLength = ( k - 1 ) * 2 ;
const index = passedLength % numbers . length ;
return numbers [ index ];
};
배열의 길이가 홀수, 짝수마다 거쳐갈 수 있는 사람이 달라서 하나의 식으로 풀이하면 예외가 있을거라고 생각했었다.
numbers.length가 홀수, 짝수마다 나머지도 고정되기 때문에 하나의 식으로 풀이해도 모든 경우의 수를 검사할 수 있었다.
# Level 0. 합성수 찾기
합성수 찾기
문제 설명
약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
첫번째 풀이
1
2
3
4
5
6
7
8
9
10
11
12 const solution = ( n ) => {
let answer = 0 ;
for ( let i = 4 ; i <= n ; i ++ ) {
for ( let j = 2 ; j <= Math . floor ( Math . sqrt ( i )); j ++ ) {
if ( i % j === 0 ) {
answer ++ ;
break ;
}
}
}
return answer ;
};
단순한 소수 찾기이다.
더 나은 방법이 없을지 고민했다.
팀원중에 한 분이 에라토스테네스의 체를 응용하는 방법에 대해 의견을 제시해주셨다.
두번째 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14 const solution = ( n ) => {
const screener = new Array ( n + 1 ). fill ( false );
for ( let i = 2 ; i <= Math . floor ( Math . sqrt ( n )); i ++ ) {
if ( screener [ i ]) continue ;
let multiplier = 2 ;
while ( i * multiplier <= n ) {
screener [ i * multiplier ] = true ;
multiplier ++ ;
}
}
return screener . filter (( result ) => result ). length ;
};
이처럼 코드를 쓰게 되면, 반복문에 대한 시간 복잡도도 줄어들고 약수의 개수에 따라 분기 처리를 하기가 더 쉬워진다.
# Level 0. 문자열 나누기
문자열 나누기
문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
첫번재 풀이
1 ≤ s의 길이 ≤ 10,000
s는 영어 소문자로만 이루어져 있습니다.
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 function solution ( s ) {
let answer = 0 ;
let currChar = "" ;
let sameCount = 0 ;
let diffCount = 0 ;
let isSplitted = true ;
s . split ( "" ). forEach (( char ) => {
if ( isSplitted ) {
answer ++ ;
currChar = char ;
sameCount = 1 ;
diffCount = 0 ;
isSplitted = false ;
return ;
}
if ( currChar === char ) {
sameCount ++ ;
} else {
diffCount ++ ;
}
if ( sameCount === diffCount ) {
isSplitted = true ;
}
});
return answer ;
}
# Level 0. 주사위의 개수
주사위의 개수
문제 설명
머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
box의 길이는 3입니다.
box[0] = 상자의 가로 길이
box[1] = 상자의 세로 길이
box[2] = 상자의 높이 길이
1 ≤ box의 원소 ≤ 100
1 ≤ n ≤ 50
n ≤ box의 원소
주사위는 상자와 평행하게 넣습니다.
풀이
1
2
3
4
5 const solution = ( box , n ) => {
return (
Math . floor ( box [ 0 ] / n ) * Math . floor ( box [ 1 ] / n ) * Math . floor ( box [ 2 ] / n )
);
};
x축에 들어갈 수 있는 주사위 개수 _ y축에 들어갈 수 있는 주사위 개수 _ z축에 들어갈 수 있는 주사위 개수
# Level 0. 최댓값 만들기 (1)
최댓값 만들기 (1)
문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
0 ≤ numbers의 원소 ≤ 10,000
2 ≤ numbers의 길이 ≤ 100
문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13 const solution = ( numbers ) => {
let firstMax = 0 ;
let secondMax = 0 ;
numbers . forEach (( number ) => {
if ( numbers [ i ] > firstMax ) {
secondMax = firstMax ;
firstMax = numbers [ i ];
} else if ( numbers [ i ] > secondMax ) {
secondMax = numbers [ i ];
}
});
return firstMax * secondMax ;
};
# Level 0. 팩토리얼
팩토리얼
문제 설명
i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 _ 4 _ 3 _ 2 _ 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
제한사항
문제 풀이
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 const solution = ( n ) => {
const memo = new Array ( 10 ). fill ( 0 );
memo [ 0 ] = 1 ;
memo [ 1 ] = 1 ;
memo [ 2 ] = 2 ;
const _memoFactorial = ( number ) => {
if ( memo [ number ]) return memo [ number ];
memo [ number ] = number * _memoFactorial ( number - 1 );
return memo [ number ];
};
_memoFactorial ( 10 );
let maxFactorial = 0 ;
memo . some (( num , index ) => {
if ( num <= n ) {
maxFactorial = index ;
return false ;
}
return true ;
});
return maxFactorial ;
};
코드는 길지만 읽었을 때 풀이의 흐름을 알 수 있도록 작성함.
# Level 0. 가장 가까운 같은 글자
가장 가까운 같은 글자
문제 설명
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s=”banana”라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
a는 자신보다 두 칸 앞에 a가 있습니다. 이는 - 2로 표현합니다.
n도 자신보다 두 칸 앞에 n이 있습니다. 이는 - 2로 표현합니다.
a는 자신보다 두 칸, 네 칸 앞에 a가 - 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
제한사항
문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 function solution ( s ) {
const answer = [];
const charMap = {};
s . split ( "" ). forEach (( char , index ) => {
if ( charMap [ char ] === undefined ) {
answer [ index ] = - 1 ;
charMap [ char ] = index ;
return ;
}
answer [ index ] = index - charMap [ char ];
charMap [ char ] = index ;
});
return answer ;
}
임상심리학자가 개발을 추구하는 건에 대해서
written by Kim Kwan-kyoung