소수 만들기

해당 문제 링크

  • 에라토스테네스의 체를 세 정수의 최대값인 2997까지 구함
  • nums 배열을 돌며 세 정수의 합을 구해 배열에 push
  • 해당 배열 값을 인덱스로 가지는 에라토스테네스의 체의 값이 false가 아니라면 answer값을 증가시킨다
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
function solution(nums) {
let combination = [];
let answer = 0;
let primeNums = [];

for(let i = 2; i <= 2997; i++){
if(primeNums[i] == false)
continue;
for(let k = i + i; k <= 2997; k += i) {
primeNums[k] = false;
}
}


for (let i = 0; i < nums.length; i++) {
for (let j = i+1; j < nums.length; j++) {
for (let k = j+1; k < nums.length; k++){
let temp = nums[i]+nums[j]+nums[k];
combination.push(temp);
}
}
}

for (let i = 0; i < combination.length; i++) {
if(primeNums[combination[i]] !== false)
answer++
}
return answer;
}

신규 아이디 추천

해당 문제 링크

1
2
3
4
5
6
7
8
1. 모든 대문자를 대응되는 소문자로 치환합니다.
2. 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3. 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4. 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5. 빈 문자열이라면, "a"를 대입합니다.
6. 길이가 16자 이상이면, 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
7. 만약 제거 후 마침표(.)가 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
8. 길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
  • 정규식을 사용해 1번부터 8번을 구현하기
  • 4번, 5번을 모르겠어서 다른 분의 풀이를 참고함
  • 정규식은 언제 봐도 어렵다…
1
2
3
4
5
6
7
8
9
10
11
function solution(new_id) {
const answer = new_id
.toLowerCase() // 1. 모두 소문자로 치환
.replace(/[^\w-_.]/g, '') // 2. \w는 밑줄 문자를 포함한 영숫자 문자에 대응
.replace(/\.{2,}/g, '.') // 3. \.{2,}로 2개 이상 연속된다면 '.'로 replace
.replace(/^\.|\.$/g, '') // 4. 마침표가 처음과 끝에 있는지 확인 ^\.| \.$(^: 입력의 시작부분, $: 입력의 끝부분)
.replace(/^$/, 'a') // 5. 시작(^)과 끝($)이 빈 문자열이라면 a로 replace
.slice(0, 15).replace(/\.$/, ''); // 6, 7. slice로 15개 문자만 남기고 4번과 마찬가지로 \.$를 사용해 끝문자열의 마침표 삭제
const len = answer.length;
return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len); // 8. 길이가 2보다 작다면 아이디 끝에 반복해서 붙이기
}

키패드 누르기

해당 문제 링크

1
2
3
4
5
6
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.
1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
4-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
function solution (numbers, hand) {
let answer = '';
let keypad = {
1: [1,1], 2: [1,2], 3: [1,3],
4: [2,1], 5: [2,2], 6: [2,3],
7: [3,1], 8: [3,2], 9: [3,3],
'*': [4,1], 0: [4,2], '#': [4,3],
}
let curLeft = keypad['*']
let curRight = keypad['#']
numbers.forEach(num => {
let numPosition = keypad[num];

if (numPosition[1] === 1) {
curLeft = numPosition
answer += 'L'
} else if (numPosition[1] === 3) {
curRight = numPosition
answer += 'R'
} else {
let distanceLeft = calDistance(curLeft, numPosition)
let distanceRight = calDistance(curRight, numPosition)

if(distanceLeft === distanceRight) {
if(hand === 'left') {
curLeft = numPosition;
answer += 'L'
} else {
curRight = numPosition;
answer += 'R'
}
} else if (distanceLeft < distanceRight) {
curLeft = numPosition;
answer += 'L';
} else {
curRight = numPosition;
answer += 'R';
}
}
})

return answer;
}

function calDistance(LeftOrRight, numPosition) {
return Math.abs(LeftOrRight[0] - numPosition[0]) + Math.abs(LeftOrRight[1] - numPosition[1])
}

하샤드 수

해당 문제 링크

  • 1분컷함…
    1
    2
    3
    4
    function solution(x) {
    let sum = (''+x).split('').map(el => el*1).reduce((acc, cur) => acc+cur, 0);
    return x%sum === 0;
    }