모의고사

모의고사
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// https://programmers.co.kr/learn/courses/30/lessons/42840
function solution(answers) {
const a = [1, 2, 3, 4, 5];
const b = [2, 1, 2, 3, 2, 4, 2, 5];
const c = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

let count = [0, 0, 0];
answers.forEach((element, index) => {
a[index % a.length] == element ? count[0]++ : null;
b[index % b.length] == element ? count[1]++ : null;
c[index % c.length] == element ? count[2]++ : null;
});
let result = [];
let max = Math.max.apply(null, count);
count.forEach((item, idx) => {
if (max == item) {
result.push(idx + 1);
}
});
return result;
}
solution([1, 2, 3, 4, 5]);

해설

  • 입력으로 정답 배열이 들어온다
  • a,b,c 세 사람이 있다
  • 사람마다 찍기 타입이 있다
  • 각자 자신만의 패턴으로 문제를 찍었을때 가장 문제를 많이 맞힌 사람을 반환한다
  • 일단 찍기타입을 정의하고,
  • 각 사람마다 정답이면 카운트를 늘린다!
  • 나머지 연산으로 패턴을 지속한다. c[index % c.length]
  • 그 중에서 가장 많이 맞춘 사람 배열을 반환한다. (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
// https://programmers.co.kr/learn/courses/30/lessons/42862
function solution(n, lost, reserve) {
var answer = 0;

let arr = [];
for (let i = 0; i < n; i++) {
arr[i] = 1;
}

for (let i = 0; i < reserve.length; i++) {
arr[reserve[i] - 1]++;
}

for (let i = 0; i < lost.length; i++) {
arr[lost[i] - 1]--;
}

for (let i = 0; i < arr.length; i++) {
// 앞에사람꺼 빌리기
if (arr[i] == 0) {
if (arr[i - 1] == 2) {
arr[i - 1]--;
arr[i]++;
continue;
}
// 뒤에사람꺼 빌리기
else if (arr[i + 1] == 2) {
arr[i + 1]--;
arr[i]++;
continue;
}
}
}

const result = arr.filter((value, index) => {
return value != 0;
});

return result.length;
}
solution(5, [2, 4], [1, 3, 5]);

해설

  • 체육복을 입을 수 있는 사람의 수를 구하는 문제다
  • 체육복을 빌릴 수 있는데, 앞 뒤 사람의 체육복만 빌릴 수 있다
  • 먼저 arr 배열을 초기화한다. lost는 -1, reserve는 +1
  • 앞에서부터 순차적으로 앞사람확인하고 여벌이 있으면 빌린다
  • 앞사람없으면 뒤에서 빌린다

2016년

2016년
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
// https://programmers.co.kr/learn/courses/30/lessons/12901
// 1월:31일
// 2월:29일
// 3월:31일
// 4월:30일
// 5월:31일
// 6월:30일
// 7월:31일
// 8월:31일
// 9월:30일
// 10월:31일
// 11월:30일
// 12월:31일
function solution(a, b) {
const days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const dow = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
let eachFirstDow = [5];
let tmp;
// setup process
for (let i = 1; i < a; i++) {
tmp = days[i - 1] % 7;
console.log(i + 1, dow[(eachFirstDow[i - 1] + tmp) % 7]);
eachFirstDow[i] = (eachFirstDow[i - 1] + tmp) % 7;
}
eachFirstDow.forEach((item) => {
console.log(dow[item]);
});
tmp = (b - 1) % 7;
return dow[(eachFirstDow[a - 1] + tmp) % 7];
}
result = solution(10, 1);
result = solution(5, 24);

해설

  • 2016년은 윤년이다
  • a월 b일을 입력받았을때 무슨요일인지 반환하는 문제이다
  • 나는 dow에 요일을 넣었다
  • 1월 1일은 무슨 요일인지 확인한다
  • 확인 결과 금요일이다
  • 첫번째 반복문에서 각 월 1일의 요일을 구한다
  • a월 1일의 요일에서 (b-1)일을 더하고 7로 나누면 해당일의 요일을 구할 수 있다

소수 찾기

소수 찾기
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
// https://programmers.co.kr/learn/courses/30/lessons/12921
function solution(n) {
var answer = 0;
let sosu = [];
let arr = {};
for (let i = 2; i <= n; i++) {
arr[i] = 1;
}

for (let index = 2; index <= n; index++) {
const element = arr[index];
if (element == 0) {
console.log('index', index);
continue;
}
sosu.push(index);
let a = 2;
// 지금 현재 값을
while (true) {
if (!(arr[index * a] + 1)) {
break;
}
arr[index * a++] = 0;
console.log(index * a);
}
}
console.log('소수:', sosu);
return sosu.length;
}
result = solution(10);
  • 효율성 통과하기 어려웠다

해설

  • 정수 n을 입력받으면 1부터 n 사이의 소수의 개수를 반환한다
  • 효율성을 통과할려면 에라토스테네스의 체를 써야한다
  • 에라토스테네스의 체 알고리즘을 구현한다
  • 글로 적힌거 봣는데 하나도 이해가 안되서, 위 그림을 보고 구현했다. (역시 그림이 최고!)
  • 첫번째 반복문에서 2부터 n까지 1로 초기화한다
  • 이제 2부터 n까지 반복문을 돈다
  • 처음에 2는 소수다. 소수 배열에 추가하고 while루프에서 arr배열에서 2의 2배수를 전부 지운다
  • 여기서 지운다는 것은 arr[2의배수] = 0 으로 만드는 것!
  • 그러면 다음 루프 3… 똑같이한다
  • 그다음 4에서 arr[4] == 0 이기때문에 바로 패스한다
  • … 반복
  • 내 글로된 설명보다 그림보는게 훨씬 이해에 빠를것이다!

에라토스테네스의 체

  • 소수를 찾는 방법

약수의 합

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/12928
function solution(n) {
if (n == 0 || n == 1) {
return n;

let arr = [1, n];
console.log(Math.sqrt(n));
for (let index = 2; index <= Math.sqrt(n); index++) {
if (n % index == 0) {
arr.push(index);
if (index == Math.sqrt(n)) {
} else {
arr.push(n / index);
}
}
}
console.log(arr);
return arr.reduce((prev, curr) => {
console.log(prev, curr);
return curr + prev;
}, 0);
}
result = solution(12); //28

해설

  • 정수를 입력받으면 모든 약수의 합을 반환한다
  • 0, 1인 경우 바로 반환한다
  • 무조건 약수인 1과 자기자신으로 약수가 저장될 배열을 초기화한다
  • 2부터 n의 제곱근까지 반복문을 돌면서 나누어 떨어지는지 판단한다
  • 나누어 떨어지면 약수 배열에 추가한다
  • 약수는 항상 세트로 존재하기 때문에, 제곱근의 경우가 아니라면 n / index 도 약수로 추가한다
  • reduce로 약수배열의 합을 구한다

자릿수 더하기

자릿수 더하기
1
2
3
4
5
6
7
8
9
10
11
// https://programmers.co.kr/learn/courses/30/lessons/12931
function solution(n) {
let answer;
n = `${n}`;
n = n.split('');
answer = n.reduce((prev, curr) => {
return parseInt(curr) + parseInt(prev);
}, 0);
return answer;
}
result = solution(123);

해설

  • 각 자릿수를 더해서 반환한다
  • reduce로 각 자릿수의 합을 구한다

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

자연수 뒤집어 배열로 만들기
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]);
  • 음.. 그러하다