Skip to content

Commit 24243d8

Browse files
[17주차] 문제 풀이 추가 (#69)
* solution: level 2 / 하노이 탑 풀이 추가 * solution: 모음사전 * solution 체육복 * solution 모의고사 * solution 위장 * solution 튜플 Co-authored-by: chaerin-dev <chaerin.dev@gmail.com>
1 parent d0b4938 commit 24243d8

File tree

6 files changed

+160
-1
lines changed

6 files changed

+160
-1
lines changed

level-1/모의고사.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,28 @@ function solution(answers) {
108108
if (score[i] === Math.max(...score)) answer.push(i+1)
109109
}
110110
return answer;
111+
}
112+
113+
//정답 5 - chaerin-dev
114+
function solution(answers) {
115+
const pattern = [
116+
[1, 2, 3, 4, 5],
117+
[2, 1, 2, 3, 2, 4, 2, 5],
118+
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
119+
];
120+
const scores = [0, 0, 0];
121+
122+
answers.forEach((answer, i) => {
123+
for (let j = 0; j < pattern.length; j++) {
124+
const patternLength = pattern[j].length;
125+
if (answer === pattern[j][i % patternLength]) scores[j]++;
126+
}
127+
});
128+
129+
const answer = [];
130+
const maxScore = Math.max(...scores);
131+
scores.forEach((score, i) => {
132+
if (score === maxScore) answer.push(i + 1);
133+
});
134+
return answer;
111135
}

level-1/체육복.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,40 @@ function solution(n, lost, reserve) {
8888
//그리디
8989
// lost 배열과 reserve 배열을 순회하여 체육복을 추가, 제거 해줍니다.
9090
// 그 후에 최종적으로 i부터 n까지 for문을 순회하며 i번쨰 학생과 i+1번째의 학생이 가진 체육복 수를 비교하여 빌려 줄 수 있는지, 빌려줄 수 없는지 확인 합니다.
91+
92+
//정답 4 - chaerin-dev
93+
function solution(n, lost, reserve) {
94+
// 학생들의 체육복 개수를 저장할 배열 students
95+
// 학생의 index가 1번부터 시작하므로 배열의 길이를 n+1로 설정
96+
// 0번 학생은 실제로는 없지만 초기값을 1로 설정하면 이후 연산에 영향을 미치지 않음
97+
const students = Array.from({ length: n + 1 }, () => 1);
98+
99+
// 체육복 분실/여분 정보 students 배열에 반영
100+
lost.forEach((lostStudent) => students[lostStudent]--);
101+
reserve.forEach((reserveStudent) => students[reserveStudent]++);
102+
103+
// 체육복이 없어 체육 수업을 들을 수 없는 학생 수를 저장할 변수 cnt
104+
let cnt = 0;
105+
students.forEach((student, i) => {
106+
// 현재 인덱스의 학생이 체육복이 없다면
107+
if (student === 0) {
108+
// 바로 앞 학생이 체육복 여분이 있다면
109+
if (students[i - 1] === 2) {
110+
// 바로 앞 학생에게 체육복 빌리기
111+
students[i - 1]--;
112+
student++;
113+
}
114+
// 바로 앞 학생에게 체육복을 빌리지 못했고, 바로 뒤 학생이 체육복 여분이 있다면
115+
else if (students[i + 1] === 2) {
116+
// 바로 뒤 학생에게 체육복 빌리기
117+
students[i + 1]--;
118+
student++;
119+
}
120+
// 바로 앞 학생과 바로 뒤 학생 모두에게 체육복을 빌리지 못했다면 체육 수업을 들을 수 없음
121+
else cnt++;
122+
}
123+
});
124+
125+
// 체육 수업을 들을 수 있는 학생 수 = 전체 학생 수 - 체육 수업을 들을 수 없는 학생 수
126+
return n - cnt;
127+
}

level-2/모음-사전.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//https://github.com/codeisneverodd/programmers-coding-test
2+
//완벽한 정답이 아닙니다.
3+
//정답 1 - codeisneverodd
4+
function solution(word) {
5+
const alphabetRank = { A: 0, E: 1, I: 2, O: 3, U: 4 };
6+
const price = calculatePrice([1], 5);
7+
return word
8+
.split("")
9+
.map((alphabet, index) => 1 + price[index] * alphabetRank[alphabet])
10+
.reduce((acc, curr) => acc + curr, 0);
11+
}
12+
const calculatePrice = (result = [1], targetLength) => {
13+
if (result.length === targetLength) return result;
14+
return calculatePrice([result[0] * 5 + 1, ...result], targetLength);
15+
};
16+
/*
17+
각 자리 문자를 바로 다음 문자로 바꾸는 데에 얼마의 비용이 들까?
18+
4번째 자리 - 1
19+
3번째 자리 - 1*5 + 1 = 6
20+
2번째 자리 - 6*5 + 1 = 31
21+
1번째 자리 - 31*5 + 1 = 156
22+
0번째 자리 - 156*5 + 1 = 781
23+
24+
검증(1부터 시작하므로 1 + 비용)
25+
I => (1 + 781 * 2) = 1563
26+
EIO => (1 + 781 * 1) + (1 + 156 * 2) + (1 + 31 * 3) = 1189
27+
AAAE => 1 + 1 + 1 + (1 + 6 * 1) = 10
28+
AAAAE => 1 + 1 + 1 + 1 + (1 + 1*1) = 6
29+
추천 레퍼런스: https://seongho96.tistory.com/50
30+
*/

level-2/위장.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,24 @@ function solution(clothes) {
6666
2. obj에 해당 키가 없으면 값을 1(옷을 입지 않은 경우)로 지정하고 1(옷의 개수)을 더해줌.
6767
3. obj에 해당 키가 있으면 해당 키의 값을 불러오고 1을 더해줌.
6868
4. for in 구문으로 obj의 키를 반복하여 불러오고 해당 값을 answer에 곱해줌
69-
5. 최소한 1가지 이상의 옷을 입기 떄문에 옷을 입지 않은 경우 -1로 제외. */
69+
5. 최소한 1가지 이상의 옷을 입기 떄문에 옷을 입지 않은 경우 -1로 제외. */
70+
71+
//정답 5 - chaerin-dev
72+
function solution(clothes) {
73+
// 각 카테고리별 의상의 수를 clothsObj 객체에 저장
74+
const clothsObj = {};
75+
clothes.forEach((cloth) =>
76+
clothsObj[cloth[1]] ? clothsObj[cloth[1]]++ : (clothsObj[cloth[1]] = 1)
77+
);
78+
79+
// 어떤 카테고리의 옷의 개수가 n개라면, 스파이는 해당 카테고리에 대해 n+1가지 선택권을 가짐
80+
// (옷을 입지 않거나, 1번 옷을 입거나, 2번 옷을 입거나, ..., n번 옷을 입거나)
81+
// 즉, (각 카테고리의 옷의 개수 + 1)를 answer에 차례로 곱해주면 됨
82+
let answer = 1;
83+
for (let key of Object.keys(clothsObj)) {
84+
answer *= clothsObj[key] + 1;
85+
}
86+
87+
// 스파이는 하루에 최소 한 개의 의상은 입어야 하므로 아무것도 입지 않는 경우 빼기
88+
return answer - 1;
89+
}

level-2/튜플.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,24 @@ function solution(s) {
1010
.sort((a, b) => a.length - b.length)
1111
for (const set of sets) answer.push(...set.filter(x => !answer.includes(x)))
1212
return answer;
13+
}
14+
15+
//정답 2 - chaerin-dev
16+
function solution(s) {
17+
// 문자열 -> 정수 이차원 배열
18+
const sArr = s
19+
.substring(2, s.length - 2)
20+
.split("},{")
21+
.map((e) => e.split(",").map((e) => parseInt(e)))
22+
.sort((a, b) => a.length - b.length);
23+
// 정답을 저장할 배열
24+
const answer = [];
25+
// 이차원배열을 순회하며 직전 배열과 겹치지 않는 요소만 answer에 추가
26+
for (let i = 0; i < sArr.length; i++) {
27+
for (let j = 0; j < sArr[i].length; j++) {
28+
const temp = sArr[i][j];
29+
if (!answer.includes(sArr[i][j])) answer.push(sArr[i][j]);
30+
}
31+
}
32+
return answer;
1333
}

level-2/하노이의-탑.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//https://github.com/codeisneverodd/programmers-coding-test
2+
//완벽한 정답이 아닙니다.
3+
//정답 1 - codeisneverodd
4+
function solution(n) {
5+
return move(1, 3, 2, n);
6+
}
7+
const move = (departure, destination, waypoint, numberOfPlate) => {
8+
if (numberOfPlate === 1) return [[departure, destination]];
9+
return [
10+
...move(departure, waypoint, destination, numberOfPlate - 1),
11+
...move(departure, destination, waypoint, 1),
12+
...move(waypoint, destination, departure, numberOfPlate - 1),
13+
];
14+
};
15+
//재귀를 생각해보기에 좋은 문제입니다.
16+
//추천 레퍼런스 https://shoark7.github.io/programming/algorithm/tower-of-hanoi
17+
/*
18+
n개가 있다면
19+
1. 1->2로 n-1개를 옮김
20+
2. 1->3으로 가장 큰 1개를 옮김
21+
3. 2->1로 n-2개를 옮김
22+
4. 2->3으로 2번에 있는 것 중 가장 큰 1개를 옮김
23+
의 반복
24+
25+
결국 무엇이든 a -> b 로 n 를 옮기는 동작의 반복이므로 이를 재귀로 표현하면 됨.
26+
a->b 로 n 을 옮기는 것은 a->c로 n-1개를 옮겨놓고, a->b로 하나를 옮긴 후, c->b로 n-1개를 옮기는 것의 반복
27+
함수에서 a는 depature(출발지), b는 destination(도착지), c는 waypoint(경유지)로 작성되어있음.
28+
*/

0 commit comments

Comments
 (0)