프로그래머스 Level 1 회고

JeongHoon Park·2021년 4월 7일
1

알고리즘 회고록

목록 보기
1/1
post-thumbnail

1. 왠 회고록??

드디어 프로그래머스 Level 1 문제들을 전부 풀게되었다!!🎉
하지만 다시 풀면 막힘없이 다 풀 수 있어??🧐
물어본다면 도망갈 것이다...ㅜ

그래서 알고리즘 회고록을 써볼까 한다.
말이 좋아 회고록이지 알고리즘 문제 복습정도로 진행하려한다😎


2. 기간

프로그래머스 문제를 처음 푼게 3월 13일이니 25일 걸린 것이네
매일 푼 것은 아니지만 총 46문제이니 하루에 2문제씩 풀었다고 보면 될라나?


3. 난이도

포기한 문제도 있고 한 문제에 1시간씩이나 든 문제도 있지만 평균적으로는 문제당 15분 내외였던걸로 기억한다.
대부분이 쉬운 문제들로 이루어져 있었다. 하지만 초보인 나는 풀긴 풀었지만 깔끔하게 풀지 못한 문제가 많았다...


4. 풀지 못한 문제들

4-1. 완주하지 못한 선수

✅문제

🗝풀이

function solution(participant, completion) {
  participant.sort();
  completion.sort();
  for (let i = 0; i < participant.length; i++) {
    if (participant[i] !== completion[i]) {
      return participant[i];
    }
  }

이 문제는 창의력 문제 같은 느낌이었다. 막 이것 저것 해보앗지만 결국은 풀지 못했다.
풀이를 본 순간 와... 천잰데? 라는 생각이 들었다ㅋㅋㅋ


4-2. 소수 만들기

✅문제

🗝풀이

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개의 합을 구하는 방법, 그리고 그 숫자의 합이 소수인지 확인하는 방법
단계를 나누고 풀려고 했으면 풀 수도 있었을 것 같다는 생각이 든다.


5. 풀었지만 더 괜찮은 풀이가 있었던 문제들

5-1. 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진법으로 변환된다는 것 메모..✍️


5-2. 같은 숫자는 싫어

✅문제

🗝풀이

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()함수로 대체 된단다... 메모..✍️


5-3. 이상한 문자 만들기

✅문제

🗝풀이

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();
  });
}

정규표현식을 이용하여 원래 코드보다 더 간결하게 만들 수 있음!


5-4. 행렬의 덧셈

✅문제

🗝풀이

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() 함수의 두번째 인자가 인덱스를 알려주는 것을 이용하여 간결한 풀이가 가능했다..!


5-5. 비밀지도

✅문제

🗝풀이

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 을 이용하여 매우 간단하게 푼 정말 고수의 풀이법이네...😳


6. 마치며🤟

알고리즘을 꾸준히 공부한지 한달정도 된것 같다.
이전에 이것 저것 구글링을 하면서 코드를 짜오면서 자바스크립트를 어느정도는 아는 것 같다고 생각했었다. 하지만 알고리즘 공부를 하면서 아직 한참 멀었다는 것을 알게되었고 자바스크립트 내장함수들이 이렇게 효율적인지 다시 알게되었다.

다음은 프로그래머스 Level 2 회고록으로 돌아오겠다.
더 시야가 넓어지기를 기약하며..⭐️

profile
Develop myself, FE developer!

0개의 댓글