자연수 뒤집어 배열로 만들기

자연수 뒤집어 배열로 만들기
1
2
3
4
5
6
7
8
// https://programmers.co.kr/learn/courses/30/lessons/12932
function solution(n) {
var answer = [];
answer = `${n}`.split('').map(Number);
answer.reverse();
return answer;
}
result = solution(12345);

해설

  • 입력으로 정수가 들어오면 거꾸로된 배열로 반환한다
  • 입력받은 정수를 문자열로 만든다
  • split으로 문자 배열로 만든다
  • map으로 다시 숫자 배열로 만든다
  • reverse로 뒤집는다

정수 내림차순으로 배치하기

정수 내림차순으로 배치하기
1
2
3
4
5
6
7
8
9
// https://programmers.co.kr/learn/courses/30/lessons/12933
function solution(n) {
n = n + '';
let arr = n.split('');
arr.sort((a, b) => b - a);
arr = arr.join('');
return Number(arr);
}
result = solution(118372);

해설

  • 정수가 들어오면 내림차순으로 배치해서 = 가장 큰 수를 만들어서 반환하면된다
  • 정수를 문자열로 캐스팅한다
  • 문자열에서 문자하나하나의 배열로 변환하고
  • 내림차순 정렬한다
  • 배열을 문자열로 만든다
  • 문자열을 숫자로 캐스팅한다

정수 제곱근 판별

정수 제곱근 판별
1
2
3
4
5
6
7
8
9
10
// https://programmers.co.kr/learn/courses/30/lessons/12934
function solution(n) {
let answer = -1;
const x = Math.sqrt(n);
if (Number.isInteger(x)) {
answer = Math.pow(x + 1, 2);
}
return answer;
}
result = solution(121);

해설

  • 입력으로 정수가 들어오면 제곱근 x를 구해서 양의 정수이면 (x+1)^2을 반환한다
  • 양의 정수가 아니면 -1을 반환한다
  • Math.sqrt(n) 은 제곱근을 구하는 함수다
  • math.pow() 는 제곱하는 함수다

제일 작은 수 제거하기

제일 작은 수 제거하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//  https://programmers.co.kr/learn/courses/30/lessons/12935
function solution(arr) {
var answer = [-1];
// 하나일때 바로 반환
if (arr.length == 1) {
return answer;
}
let min = Math.min.apply(null, arr);
// let min = Math.min(...arr);
let tmp = arr.filter((val, idx) => {
return val != min;
});
console.log(tmp);
return tmp;
}

result = solution([4, 3, 2, 1]);

해설

  • 입력으로 배열이 들어오면, 그중에서 가장 작은 수를 없애고 리턴하면 된다
  • 정렬을 사용하면 편하겠지만 원래의 배열 순서에서 최소값만 쏙하고 빼서 리턴해야한다
  • 나는 배열에서 최소값을 구하고
  • 필터를 통해서 최소값을 제외한 배열을 얻어서 반환했다

다른 사람의 풀이

1
2
3
4
5
6
function solution2(arr) {
arr.splice(arr.indexOf(Math.min(...arr)), 1);
if (arr.length < 1) return [-1];
return arr;
}
result = solution([4, 3, 2, 1]);
  • 음.. 그러하다

[카카오 인턴] 키패드 누르기

[카카오 인턴] 키패드 누르기
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// https://programmers.co.kr/learn/courses/30/lessons/67256
function solution(numbers, hand) {
// 1,4,7 ; left
// 2,5,8,0 ; 가까운거, 같을시 왼손잡이냐 오른손잡이냐
// 3,6,9 ; right
switch (hand) {
case 'left':
hand = 'L';
break;
default:
hand = 'R';
break;
}
let curleft = '*';
let curright = '#';
let answer = '';
const maptable = {
1: { low: 0, col: 0 },
2: { low: 0, col: 1 },
3: { low: 0, col: 2 },
4: { low: 1, col: 0 },
5: { low: 1, col: 1 },
6: { low: 1, col: 2 },
7: { low: 2, col: 0 },
8: { low: 2, col: 1 },
9: { low: 2, col: 2 },
'*': { low: 3, col: 0 },
0: { low: 3, col: 1 },
'#': { low: 3, col: 2 },
};
let keypad = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[-1, 0, -2],
];
function getCost(num, cur) {
let cost = 0;
const src = maptable[cur];
const des = maptable[num];
let low = Math.abs(des['low'] - src['low']);
let col = Math.abs(des['col'] - src['col']);
cost = low + col;
return cost;
}
let x;
numbers.forEach((number, idx) => {
if (number.toString().match(/[369]/)) {
x = 'R';
curright = number;
} else if (number.toString().match(/[147]/)) {
x = 'L';
curleft = number;
} else {
// 가까운손
const costleft = getCost(number, curleft);
const costright = getCost(number, curright);
if (costleft == costright) {
x = hand;
switch (hand) {
case 'L':
curleft = number;
break;
default:
curright = number;
break;
}
} else if (costleft > costright) {
x = 'R';
curright = number;
} else {
x = 'L';
curleft = number;
}
}
answer += x;
});
return answer;
}
result = solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], 'right');
result = solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], 'left');
result = solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], 'right');

해설

  • 입력으로 키패드를 누르는 순서와 왼손잡이인지 오른손잡이인지 알려주는 문자열을 받는다
  • 그러면 “LRLLLRLLRRL” 식으로 각 숫자를 어떤 손으로 눌렀는지 문자열로 반환한다
  • 147, 369는 좌우 키패드이기때문에 어떤 손으로 눌러야하는 정해져 있고,
  • 문제는 가운데 있는 키들이다. 2580
  • 2580중 하나의 키를 눌러야하는 상황이면 가까운 손으로 눌러야한다
  • 거리가 같은 경우에는 왼손잡이는 왼손으로, 오른손잡이는 오른손으로 누른다
  • 나는 정규식으로 147, 369를 처리하고
  • 가운데 키를 누르는 경우에는 왼손 오른손 누가더 가까운데 getCost 함수로 비교한다
  • getCost함수는 그냥 몇칸 떨어져 있는지 비교하는 단순한 함수이다
  • maptable이라는걸 만들어서 키패드를 2차원 배열로 표시해을 때 인덱스를 저장했다

최대공약수와 최소공배수

최대공약수와 최소공배수
1
2
3
4
5
6
7
8
9
10
11
12
// https://programmers.co.kr/learn/courses/30/lessons/12940
function solution(n, m) {
var answer = [];
function gcd(a, b) {
return b ? gcd(b, a % b) : a;
}
let tmp = gcd(n, m);
answer.push(tmp);
answer.push((n * m) / tmp);
return answer;
}
result = solution(3, 12);

해설

  • GCD ; greatest common divisor ; 최대공약수
  • 입력으로 두 수가 들어오면 [ 최대공약수, 최소공배수 ]를 반환한다
  • 최대공약수는 gcd함수를 이용해서 재귀적으로 구하고
  • 최소공배수는 n * m / gcd 로 구할 수 있다

콜라츠 추측

콜라츠 추측
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// https://programmers.co.kr/learn/courses/30/lessons/12943
function solution(num) {
let answer = 0;
let curval = num;
let i;
for (i = 0; i < 500; i++) {
console.log(i, curval);
if (curval == 1) {
break;
}
if (curval % 2 == 0) {
curval /= 2;
} else {
curval *= 3;
curval++;
}
}
answer = i == 500 ? -1 : i;
return answer;
}
result = solution(6);

해설

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다

  • 위 과정을 반복하면 모든 수를 1로 만들 수 있다는게 콜라츠 추측..
  • 위 과정을 코드로 표현한다

하샤드 수

하샤드 수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// https://programmers.co.kr/learn/courses/30/lessons/12947
function solution(x) {
let answer = true;
const saveX = x;
x += '';
arr = x.split('');
arr = arr.map(Number);
const result = arr.reduce((prev, curr) => {
return curr + prev;
}, 0);
if (saveX % result != 0) {
answer = false;
}
return answer;
}
result = solution(10);

해설

  • 정수 입력이 들어오면 하샤드 수인지 판별하여 bool을 반환
  • 정수를 자릿수별로 조작하기 위해 문자열로 캐스팅
  • 문자열을 배열로 변환
  • 배열의 각 원소는 문자인데 map으로 숫자로 캐스팅
  • reduece로 자릿수의 합을 구합
  • 나누어 떨어지는 확인

하샤드 수

1
2
3
4
5
6
7
8
9
18
1 + 8 = 9
18 % 9 == 0
18은 하샤드 수!

19
1 + 9 = 10
19 * 10 != 0
19는 아님!
  • 자릿수를 모두 더한다.(10진수 기준)
  • 자릿수를 모두 더한 합으로 원래 수를 나눴을 때 나누어 떨어지는지 판별한다

핸드폰 번호 가리기

핸드폰 번호 가리기
1
2
3
4
5
6
7
8
9
10
// https://programmers.co.kr/learn/courses/30/lessons/12948
function solution(phone_number) {
let answer = '';
for (let index = 0; index < phone_number.length - 4; index++) {
answer += '*';
}
return answer + phone_number.slice(-4);
}

result = solution('01033334444');

해설

  • 인풋 문자열에서 뒤 4자리만 남기고 '*'문자로 변환하는 거다
  • 나는 그냥 인풋 문자열 길이에서 4번 적게 '*'을 찍고
  • 마지막 문자열 4개를 잘라다가 붙였다

다른 사람의 풀이

1
2
3
4
// 정규식 풀이 다른사람
function hide_numbers(s) {
return s.replace(/\d(?=\d{4})/g, '*');
}
  • 정규식을 이용해 아름답게 줄였다..

참고 정규식 시각화하는 곳

행렬의 덧셈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// https://programmers.co.kr/learn/courses/30/lessons/12950
function solution(arr1, arr2) {
var answer = [];
arr1.forEach((row, rowidx) => {
let tmpRow = [];
row.forEach((col, colidx) => {
tmpRow[colidx] = col + arr2[rowidx][colidx];
});
answer.push(tmpRow);
});
return answer;
}

result = solution(
[
[1, 2],
[2, 3],
],
[
[3, 4],
[5, 6],
]
);

해설

  • array api forEach 쓸때 index 값을 두번째 파라미터로 받을 수 있다
  • 그래서 구조가 같은 배열(행렬)의 경우 반복문 하나로 돌릴 수 있다

다른 사람의 풀이

1
2
3
4
// 다른사람 풀이 map
function sumMatrix(A, B) {
return A.map((a, i) => a.map((x, j) => x + B[i][j]));
}
  • map을 이용해서 간결하게 표현했다..