21-03-04 알고리즘 문제풀이 w/ javascript
자바스크립트 알고리즘 문제풀이(01 ~ 22번)
- 세 수 중 최소값
1
2
3
4
5
6
7const minimum_number = (a, b, c) => {
let answer;
if(a < b) answer = a;
else answer = b;
if (c < answer) answer = c;
return answer
} - 삼각형 판별하기
1
2
3
4
5
6
7
8
9
10
11const isTriangle = (a, b, c) => {
// 제일 긴 변을 제외한 두 변의 길이의 합이 제일 긴 변 보다 커야함
let answer = "YES", max;
let sum = a + b + c;
if(a > b) max = a;
else max = b;
if (c > max) max = c;
if ((sum-max) <= max) return answer = "NO"
else return answer
} - 연필 수 구하기
1
2
3const pencil_number = n => {
return Math.ceil(n/12)
} - 1부터 N까지의 합
1
2
3
4
5
6
7const sum = (n) => {
let answer = 0;
for (let i = 1; i <= n; i++){
answer += i;
}
return answer
} - 최소값 구하기
1
2
3const minVal = arr => {
return Math.min(...arr);
} - 수 더하기: filter함수와 reduce함수를 사용하여 구하기
1
2
3const oddSum = arr => {
return arr.filter(n => n%2 != 0).reduce((acc, cur) => acc+cur, 0)
} - 10부제
1
2
3const carSelect = (day, arr) => {
return arr.filter(carNum => carNum%10 === day).length
} - 일곱난쟁이
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
37
38
39
40
41
42
43
44
45
46
47// 단순 정렬
const sortHeight = arr => {
let height = [...arr];
for (let i = 0; i < arr.length; i++) {
for (let j = i+1; j < arr.length; j++){
let temp = 0;
if (height[i] > height[j]) {
temp = height[j]
height[j] = height[i]
height[i] = temp
}
}
}
return height.slice(0,7);
}
// 합병정렬 하기
const sortHeight = arr => {
// 1. 탈출구문을 만들기 (arr을 더이상 쪼갤 수 없을 때 탈출)
if(arr.length === 1) return arr;
// 2. 배열을 둘 로 쪼개기 Divide
let mid = Math.floor(arr.length/2);
let leftside = arr. splice(0, mid);
// 3. 각각 합병하기 Conqure
return merge(sortHeight(leftside), sortHeight(arr)).slice(0,7)
// 문제는 키가 작은 일곱명을 선출하는 것
}
function merge(left, right) {
// 정리용 빈 배열을 만들기
let result = [];
// 각 배열에서 원소를 꺼낼 것이기 때문에 두 배열이 전부 빈 배열이 되면 끝나도록 while문으로 반복
while (left.length !== 0 && right.length !== 0) {
// 두 배열의 첫번째 인자를 비교하여 오른쪽이 더 크거나 같다면 작은 수인 왼쪽 배열의 수를 꺼내 정리용 배열에 푸쉬
left[0] <= right[0] ? result.push(left.shift()) : result.push(right.shift());
}
// spreading operator로 result 배열과 나머지 배열 값들을 담아 리턴
return [...result, ...left, ...right];
}
// ES2015 문법을 사용하여 정렬하여 잘라내기
const sortHeight2 = arr => {
return arr.sort((a,b) => a-b).slice(0,7)
} - A를 #으로 변경하기 (문자열 다루기)
1
2
3
4
5const changeChar = str => {
return str.split('')
.map(char => (char === "A") ? char = "#" : char )
.join("")
} - 문자 찾기
1
2
3const searchChar = (str, char) => {
return str.split("").filter(each => each === char).length;
} - 대문자 찾기
1
2
3
4const searchCaptial = str => {
return str.split("")
.filter(each => each === each.toUpperCase()).length
} - 대문자로 통일하기
1
2
3const changeCapital = str => {
return str.split("").map(el => el.toUpperCase()).join("")
} - 가장 긴 문자열 찾기
1
2
3const searchLongestStr = strArr => {
return strArr.sort((a,b) => b.length - a.length)[0]
} - 가운데 문자열 출력하기
1
2
3
4
5
6const middleChar = str => {
let len = str.length;
return (len%2 === 0)
? str.split("").slice((len/2)-1, Math.floor(len/2)+1).join("")
: str.split("").slice((len/2), Math.floor(len/2)+1)[0]
} - 중복된 문자 제거: Set으로 중복을 제거하고 spread operator를 사용
1
2
3
4const deduplication = str => {
let split = str.split('');
return [...new Set(split)].join('')
} - 배열 내 중복된 단어 제거
1
2
3const deduplicationArr = arr => {
return [...new Set(arr)]
} - 큰 수 출력하기
1
2
3const largerThen = (n, arr) => {
return arr.filter(el => el > n)
} - 보이는 학생
1
2
3
4
5
6
7
8const visibleStudent = arr => {
let standard = arr[0];
let count = 1; // 첫번째 사람은 무조건 보이므로 1로 시작
for(let student of arr) {
if (student > standard) count++
}
return count;
} - 가위 바위 보
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15const rsp = (n, A, B) => {
let winner = [];
for (let i = 0; i < n; i++) {
if (A[i] === 1 && B[i] === 3) {
winner.push("A")
} else if (A[i] === 2 && B[i] === 1) {
winner.push("A")
} else if (A[i] === 3 && B[i] === 2) {
winner.push("A")
} else {
winner.push("B")
}
}
return winner;
} - 점수 계산
1
2
3
4
5
6
7const scoring = (ox, score) => {
let sum = 0;
for (let i = 0; i < score.length; i++){
ox[i] === 1 ? sum += score[i] : sum
}
return sum;
} - 등 수 구하기
1
2
3
4
5
6
7
8
9
10
11const lank = (n, scores) => {
let lank = Array.from({length:n}, () => 1)
for(let i = 0; i< n; i++){
for(let j = 0; j < n; j++){
if (scores[j] > scores[i]) lank[i]++;
}
}
return lank;
}
// 처음에는 내림차순으로 정렬해서 index값을 구하고자 했는데 같은 값이 들어오면 같은 등수로 처리해야 한다는 것을 간과함 - 격자판 내 가장 큰 합 구하기
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
27let gridArr = [
[10, 13, 10, 12, 15],
[12, 39, 30, 23, 11],
[11, 25, 50, 53, 15],
[19, 27, 29, 37, 27],
[19, 13, 30, 13, 10]
]
const maxSumInGrid = gridArr => {
let rowSum = gridArr.map(row => row.reduce((acc, cur) => acc+cur, 0))
let culSum = [];
for (let i = 0; i < gridArr.length; i++) {
let sum = 0;
for (let j = 0; j < gridArr.length; j++){
sum += gridArr[j][i];
}
culSum.push(sum);
}
let downSum = upSum = 0
for (let i = 0; i < gridArr.length; i++){
downSum += gridArr[i][i];
upSum += gridArr[i][gridArr.length-i-1]
}
let crossSum = [downSum, upSum]
return Math.max(...rowSum, ...culSum, ...crossSum)
}기초 문제 풀며 느낀 점
- 이차원 배열을 다룰 때 map과 reduce를 어떻게 하면 잘 사용할 수 있을지 공부하기
- if/else문을 사용하여 분기점을 여러개 만드는 걸 꺼리고 있는데 brute-force방식으로도 문제를 풀어보기