드디어 프로그래머스 Level 1 문제들을 전부 풀게되었다!!🎉
하지만 다시 풀면 막힘없이 다 풀 수 있어??🧐
물어본다면 도망갈 것이다...ㅜ
그래서 알고리즘 회고록을 써볼까 한다.
말이 좋아 회고록이지 알고리즘 문제 복습정도로 진행하려한다😎
프로그래머스 문제를 처음 푼게 3월 13일이니 25일 걸린 것이네
매일 푼 것은 아니지만 총 46문제이니 하루에 2문제씩 풀었다고 보면 될라나?
포기한 문제도 있고 한 문제에 1시간씩이나 든 문제도 있지만 평균적으로는 문제당 15분 내외였던걸로 기억한다.
대부분이 쉬운 문제들로 이루어져 있었다. 하지만 초보인 나는 풀긴 풀었지만 깔끔하게 풀지 못한 문제가 많았다...
✅문제
🗝풀이
function solution(participant, completion) {
participant.sort();
completion.sort();
for (let i = 0; i < participant.length; i++) {
if (participant[i] !== completion[i]) {
return participant[i];
}
}
이 문제는 창의력 문제 같은 느낌이었다. 막 이것 저것 해보앗지만 결국은 풀지 못했다.
풀이를 본 순간 와... 천잰데? 라는 생각이 들었다ㅋㅋㅋ
✅문제
🗝풀이
const solution = (nums) => {
let ans = 0;
for (let i = 0; i < nums.length - 2; i++) {
for (let j = i + 1; j < nums.length - 1; j++) {
for (let k = j + 1; k < nums.length; k++) {
if (checkPrime(nums[i] + nums[j] + nums[k])) {
ans += 1;
}
}
}
}
return ans;
};
const checkPrime = (n) => {
let prime = true;
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
prime = false;
}
}
return prime;
};
소수 만들기... 이 문제는 감을 못 잡았었다..
중복되지 않는 숫자 3개의 합을 구하는 방법, 그리고 그 숫자의 합이 소수인지 확인하는 방법
단계를 나누고 풀려고 했으면 풀 수도 있었을 것 같다는 생각이 든다.
✅문제
🗝풀이
function solution(n) {
let base = [],
answer = 0;
while (n > 0) {
base.push(n % 3);
n = Math.floor(n / 3);
}
for (let i = 0; i < base.length; i++) {
if (base[i] !== 0) {
answer += base[i] * Math.pow(3, base.length - i - 1);
}
}
return answer;
}
👍더 나은 풀이
const solution = (n) => {
return parseInt([...n.toString(3)].reverse().join(""), 3);
}
이걸 보고 아 머리가 똑똑하면 몸이 고생 안한다는 걸 다시 느꼈다..🥲
내가 힘들게 12줄이나 쓴 함수를 단 한줄
로 마무리지었다.
여기서 toSting(n)
함수를 통해 n진법으로 변환된다는 것 메모..✍️
✅문제
🗝풀이
function solution(arr) {
let answer = [];
for (let i = 0; i < arr.length; i++) {
if (answer[answer.length - 1] !== arr[i]) {
answer[answer.length] = arr[i];
}
}
return answer;
}
👍더 나은 풀이
function solution(arr) {
return arr.filter((val, index) => val != arr[index + 1]);
}
for () {if () {}}
는 filter()
함수로 대체 된단다... 메모..✍️
✅문제
🗝풀이
function solution(s) {
return s
.split(' ')
.map((word) => {
let result = '';
for (let i = 0; i < word.length; i++) {
if (i % 2) {
result += word[i].toLowerCase();
} else {
result += word[i].toUpperCase();
}
}
return result;
})
.join(' ');
}
👍더 나은 풀이
function solution2(s) {
return s.toUpperCase().replace(/(\w)(\w)/g, function (a) {
return a[0].toUpperCase() + a[1].toLowerCase();
});
}
정규표현식
을 이용하여 원래 코드보다 더 간결하게 만들 수 있음!
✅문제
🗝풀이
const solution = (arr1, arr2) => {
let ans = [[]];
for (let i = 0; i < arr1.length; i++) {
for (let j = 0; j < arr1[i].length; j++) {
ans[i].push(arr1[i][j] + arr2[i][j]);
}
ans.push([]);
}
ans.pop();
return ans;
};
👍더 나은 풀이
const solution2 = (A, B) => {
return A.map((a, i) => a.map((b, j) => b + B[i][j]));
};
map()
함수의 두번째 인자가 인덱스를 알려주는 것을 이용하여 간결한 풀이가 가능했다..!
✅문제
🗝풀이
const solution = (n, arr1, arr2) => {
let binArr = [[], []],
map = [],
ans = [];
for (let i = 0; i < n; i++) {
binArr[0].push(arr1[i].toString(2).split(''));
while (binArr[0][i].length < n) {
binArr[0][i].unshift('0');
}
binArr[1].push(arr2[i].toString(2).split(''));
while (binArr[1][i].length < n) {
binArr[1][i].unshift('0');
}
map.push([]);
for (let j = 0; j < n; j++) {
if (binArr[0][i][j] === '1' || binArr[1][i][j] === '1') {
map[i][j] = '#';
} else {
map[i][j] = ' ';
}
}
ans.push(map[i].join(''));
}
return ans;
};
👍더 나은 풀이
const solution2 = (n, arr1, arr2) => {
return arr1.map((v, i) =>
addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, (a) =>
+a ? '#' : ' '
)
);
};
비트 연산
- (v | arr2[i])
, toString(n)
n진법 변환, 정규표현식
- /1|0/g
을 이용하여 매우 간단하게 푼 정말 고수의 풀이법이네...😳
알고리즘을 꾸준히 공부한지 한달정도 된것 같다.
이전에 이것 저것 구글링을 하면서 코드를 짜오면서 자바스크립트를 어느정도는 아는 것 같다고 생각했었다. 하지만 알고리즘 공부를 하면서 아직 한참 멀었다는 것을 알게되었고 자바스크립트 내장함수들이 이렇게 효율적인지 다시 알게되었다.
다음은 프로그래머스 Level 2 회고록으로 돌아오겠다.
더 시야가 넓어지기를 기약하며..⭐️