ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeKata] 위코드 5주차 코드카타
    Algorithm 2021. 1. 11. 03:18
    반응형

    🤔 서론

    코드카타가 3주차에 돌입했다. 세션과 과제도 있었고, 무엇보다 이번주부터 프로젝트가 시작되며 새로운 팀원 기열님과 약속했다.

    '11시까지 코드카타를 끝낸다!', 그 시간동안 최대한 방법을 강구해보고, 구현도 시도해보고, 실패하면 모범답안을 서로 연구하겠다.


    👊 1.11(월) / String 메서드 활용

    📜 문제

     

    두 개의 input에 복소수(complex number)가 string 으로 주어집니다.

    복소수란 a+bi 의 형태로, 실수와 허수로 이루어진 수입니다. input으로 받은 두 수를 곱해서 반환해주세요.

    반환하는 표현도 복소수 형태의 string 이어야 합니다. 복소수 정의에 의하면 (i^2)는 -1 이므로 (i^2) 일때는 -1로 계산해주세요. 

     

    예제 1:Input: "1+1i", "1+1i" Output: "0+2i"

    설명: (1 + i) * (1 + i) = 1 + i + i + i^2 = 2i, 2i를 복소수 형태로 바꾸면 0+2i.

     

    예제 2:Input: "1+-1i", "1+-1i" Output: "0+-2i"

    설명: (1 - i) * (1 - i) = 1 - i - i + i^2 = -2i, -2i를 복소수 형태로 바꾸면 0+-2i.

     

    예제 3:Input: "1+3i", "1+-2i" Output: "7+1i"

    설명: (1 + 3i) * (1 - 2i) = 1 - 2i + 3i -6(i^2) = 1 + i + 6, 7+i를 복소수 형태로 바꾸면 7+1i.

     

    input은 항상 a+bi 형태입니다.
    output도 a+bi 형태로 나와야 합니다.

     

    🧮 풀이

    const complexNumberMultiply = (a, b) => {
      let firstArr = a.substring(0, a.length-1).split('+');
      const a1 = Number(firstArr[0])
      const a2 = Number(firstArr[1])
    
      let secondArr = b.substring(0, b.length-1).split('+');
      const b1 = Number(secondArr[0])
      const b2 = Number(secondArr[1])
    
      return `${a1 * b1 - a2 * b2}+${a1 * b2 + a2 * b1}i`
    }

     

    🖇 리뷰

     

    사실 Repl.it에 답이 적혀있어서... 자체풀이가 거의 안되서 모범답안 해석으로 진행하였다.

    설명이해가 어렵지 문제가 난이도가 있는것 같진 않다. 숫자는 숫자끼리, i는 i끼리 계산해주면 되는 응용 사칙연산 문제였다.

    'a+bi' 형태를 'length - 1' 전까지 substring() 하고, +로 split() 하면 앞/뒤의 숫자를 배열화한 메서드 활용이 깔끔했다.


    👊 1.12(화) / String 메서드 활용

    📜 문제

     

    문자로 구성된 배열을 input으로 전달하면, 문자를 뒤집어서 return 해주세요.

    • 새로운 배열을 선언하면 안 됩니다.
    • 인자로 받은 배열을 수정해서 만들어주세요.

     

    🧮 풀이

    const reverseString = s => {
      return s.reverse()
    };

     

    🖇 리뷰

     

    왜인지 모르겠지만, 너무 쉬워서 리뷰는 달지 않겠다. 메소드를 안 썼다면, 순회와 push() 등을 사용했으면 될 것 같다.


    👊 1.13(수) / 그리드 알고리즘

    📜 문제

     

    양수로 이루어진 m x n 그리드를 인자로 드립니다.
    상단 왼쪽에서 시작하여, 하단 오른쪽까지 가는 길의 요소를 다 더했을 때, 가장 작은 합을 찾아서 return 해주세요.

    한 지점에서 우측이나 아래로만 이동할 수 있습니다.

    설명: 1→3→1→1→1 의 합이 제일 작음

     

    🧮 풀이

     

    예전에, DFS 방법을 적용할까 했는데 적용하는 방법 자체가 어렵기도 하고 함수 안에서 실행하다보니 풀이가 나오질 않았다.

    가로이동, 세로이동 두 가지 조건에서 최소값을 비교한다는 로직은 맞았고,

    정답은 각 좌표에서 최소 합을 누적해가는 방법으로 이해하고 코드를 해석했다.

     

    🖇 리뷰

    const minPathSum = grid => {
      for (let i = 1; i < grid.length; i++) {
        grid[i][0] += grid[i-1][0];
      }
        
      for (let i = 1; i < grid[0].length; i++) {
         grid[0][i] += grid[0][i-1];
      }    
        
      for (let i = 1; i < grid.length; i++) {
        for (let j = 1; j < grid[0].length; j++) {
                
          grid[i][j] += Math.min(grid[i-1][j], grid[i][j-1]);
        }
      }
    
      return grid[grid.length-1][grid[0].length-1];
    };

    사실


    👊 1.14(목) / String 메서드 활용

    📜 문제

     

    주어진 숫자 배열에서, 0을 배열의 마지막쪽으로 이동시켜주세요. 원래 있던 숫자의 순서는 바꾸지 말아주세요.

    (새로운 배열을 생성해서는 안 됩니다.)

     

    🧮 풀이

    const moveZeroes = nums => {
      let zeroCount = 0;
      
      for (let i = 0 ; i < nums.length ; i++) {
        if (nums[i] === 0) {
          nums.splice(i,1);
          i--;
          zeroCount++;
        }
      }
      
      for (let i = 0 ; i < zeroCount ; i++) {
        nums.push(0)
      }
      
      return nums
    }

    사실 좋은 방법이라고 할 순 없다 ㅎㅎㅎㅎ;; 배열을 쓰지 않는 조건으로, 0을 num에서 빼고 그 갯수만큼 zeroCount를 올렸다.

    다시, 그 zeroCount만큼 num에 push 해준 것이니... [0, 0, 0] 생성 후 concat() 이랑 다를바 없는 로직인 것이다. 

     

    🖇 리뷰

    const moveZeroes = nums => {
      let last0 = 0;
      
      for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== 0) {
          let temp = nums[i];
          nums[i] = nums[last0];
          nums[last0] = temp;
          last0++;
        }
        console.log(i+1+"번째 : ", nums)
      }
      
      return nums;
    }
    
    moveZeroes([0,1,0,2,0,3])

    왜인지 모르겠지만, 너무 쉬워서 리뷰는 달지 않겠다. 메소드를 안 썼다면, 순회와 push() 등을 사용했으면 될 것 같다.

    반응형
Designed by Tistory.