-
[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() 등을 사용했으면 될 것 같다.
반응형'Algorithm' 카테고리의 다른 글
[CodeKata] 위클리 프로그래머스(2월 2주차) (0) 2021.02.08 [CodeKata] 위클리 프로그래머스(2월 1주차) (0) 2021.02.01 [CodeKata] 위클리 프로그래머스(1월 4주차) (0) 2021.01.26 [CodeKata] wecode 4주차 코드카타 (0) 2021.01.03 [CodeKata] wecode 3주차 코드카타 (0) 2020.12.28