[Code Kata]

Bas·2021년 3월 29일
1

no.1

문제

twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면,
더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.

nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열

예를 들어,
nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열

예를 들어,
nums은 [4, 9, 11, 14]
target은 13

nums[0] + nums[1] = 4 + 9 = 13 이죠?

그러면 [0, 1]이 return 되어야 합니다.

가정
target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다.

풀이

  1. 처음 풀이
<script>
const twoSum = (nums, target) => {
  for (let i = 0; i < nums.length; i++) {
    for(let j = 1; j < i; j++) {
     
      if ( nums[i]+nums[j] === target) {
      return [i, j]; 
      }
    }
  }
}
</script>

먼저 twoSum 함수의 숫자 배열을 for문을 사용하여 돌려줘야 한다고 생각했습니다.
nums에서 2개의 수를 빼내와 더해줘야 하기 때문에 for문을 2개 만들어주었고, return 될 배열의 index 0의 자리는 nums[0]값 부터, return 될 배열의 index 1의 자리는 nums[1]부터 시작하도록 성정하였습니다.
또한 j는 i보다 작을 때에만 for을 돌리므로 i < j로 조건을 설정하였습니다.(하지만 값이 끊임없이 나오기 때문에 비효율적인 문제가 있습니다.)

  1. 더 효율적인 방법
<script>
 const twoSum = (nums, target) => {
   for (let i = 0; i < nums.length - 1; i++) {
     for(let j = i + 1; j < nums.length ; j++) {
       if ( nums[i]+nums[j] === target) {
         return [i, j];
       }
     }
   }
 }
</script>

또한 첫 번재 for 구문에 nums.length에 -1을 주었는데 -1을 주지 않아도 값은 나오지만

const nums= [4, 9, 11, 14];
const target = 13; 로 가정했을 때,

  • i < nums.length - 1; 을 주었을 때:
4 9
4 11
4 14
9 9
9 11
9 14
11 9
11 11
11 14
  • i < nums.length ; 을 주었을 때:
4 9
4 11
4 14
9 9
9 11
9 14
11 9
11 11
11 14
14 9  ❗️
14 11 ❗️
14 14 ❗️
(중복 값까지 출력 됨)

no.2

문제

reverse 함수에 정수인 숫자를 인자로 받습니다.
그 숫자를 뒤집어서 return해주세요.

x: 숫자
return: 뒤집어진 숫자를 반환!


예들 들어,
x: 1234
return: 4321

x: -1234
return: -4321

x: 1230
return: 321

풀이

<script>
  const reverse = x => {
    str = x.toString().split('').reverse();
      console.log(str)
    if (str[str.length-1] == '-'){
      str.pop();
      str.unshift('-')
    } return Number(str.join(''));
  }

  console.log(reverse(-1234));
</script>

로직 생각

  1. 정수인 숫자를 인자로 받고, 숫자를 뒤집은 값을 return 해야한다. 즉, 숫자 -> 숫자
  2. 숫자는 number data type이고 뒤집는 것은 불가능하다.
  3. 따라서 다음과 같은 순서로 만들어보자
  • 숫자 x 를 String으로 바꾼다.
  • 바꾼 string을 array로 빠구고, 배열의 각 요소들은 숫자가 하나씩 들어가도록 한다.
  • revers 함수를 이용하여 배열을 뒤집는다.
  • 뒤집은 배열을 다시 --> string --> number 로 바꾸어 값을 낸다.

예상하지 못한 문제

  • 1234->4321
  • 1230-> 321
    이렇게 출력이 되었지만,
  • -1234->4321- 이렇게 마이너스 값은 마이너스까지 뒤로 가버림.

=> 해결 방법
x가 뒤집은 배열의 모양일 때 - 를 빼서 앞에 붙이자.

개념 정리

✅ String.prototype.split()

[String to Array]
split() 메서드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.

✅ Array.prototype.join()

[Array to String]
join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.

const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// expected output: "Fire,Air,Water"

console.log(elements.join(''));
// expected output: "FireAirWater"

console.log(elements.join('-'));
// expected output: "Fire-Air-Water"

✅ 항상 요소의 데이터 타입이 뭔지 생각하며 풀자

typeof


no.6

문제

숫자로 이루어진 배열인 nums를 인자로 전달합니다.
숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.

예를 들어,

nums = [3,2,3]
return 3
 
nums = [2,2,1,1,1,2,2]
return 2
nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2

가정
nums 배열의 길이는 무조건 2개 이상

🍓 문제 접근 방법

구체적인 case를 정하고 일반화하기.
[1, 2, 1, 2, 1]

1.sort로 배열 정리하기

nums를 [1, 2, 1, 2, 1]이라고 가정하고 문제에 접근하겠습니다.

배열 nums가 [1, 1, 1, 2, 2]이런 모양으로 되어있으면 가운데 값을 기준으로 반을 나누면 과반수인 값을 찾을 수 있습니다.
sort 함수를 사용하면

function moreThanHalf(nums) {
	const sortArr = nums.sort();
}

2. array의 길이가 홀수일 때

여기서 (sortArr.length-1)/2를 구해보면 가운데 있는 1의 인덱스 값, 2가 나옵니다. 그럼 1이 과반수를 넘은 것임을 알게 됩니다.

function moreThanHalf(nums) {
	const sortArr = nums.sort();
    return sortArr[(sortArr.length-1)/2];
}

그런데 이럴 경우에는 배열의 길이가 홀수 일 때만 적용이 됩니다. 만약 [1, 1, 1, 2, 2, 3]일 경우에는 배열의 길이가 소수로 나오겠죠?

따락서 배열의 길이가 홀수일 때, 짝수일 때로 조건을 나눠서 값을 return 나오도록 하겠습니다.

3. array의 길이가 짝수일 때

[1, 1, 2, 2, 2, 2]sortArr.length/2-1

4. 완성

function moreThanHalf(nums) {
  const sortArr = nums.sort();
	if(sortArr.length % 2 == 1){
		return sortArr[(sortArr.length-1)/2];
	}else if (sortArr.length % 2 == 0){
		return sortArr[sortArr.length/2-1];
	}
}

no.8

문제

nums는 숫자로 이루어진 배열입니다.
가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

nums = [1,1,1,2,2,3],
k = 2
 
return [1,2]
 
nums = [1]
k = 1
 
return [1]

풀이

<script>
  function topK(nums, k) {
   let obj = {};
   for( let i in nums) {
      nums[i] in obj ? obj[nums[i]] += 1 : obj[nums[i]] = 1;
   }
   let sorted = Object.keys(obj).sort(function(a, b) {
       return obj[b] - obj[a]
   })
   return sorted.slice(0, k).map(x => parseInt(x))
  }
</script>

no.10

  • 처음 푼 방법
<script>
const Arr = [1, 8, 6, 2, 5, 4, 8, 3, 7];

function getMaxArea(Arr) {
  const areas = [];
 for(let i = 0; i < Arr.length -1 ; i++) {
   for(let j = i+1; j < Arr.length; j++) {
     const width = i - j;
     const widthX = Math.abs(width);
     const heightY = Arr[i] < Arr[j] ? Arr[i] : Arr[j];
     const area = widthX*heightY;
     areas.push(area);
   }
 }
 return areas.sort((a,b)=>b-a)[0]
}
getMaxArea(Arr);
</script>
  • 두 번째 방법
<script>
function getMaxArea(h) {
  result= [];
  for (let i =0; i<h.length ; i++ ){
    for (let j = 0; j<h.length; j++){
      if(j===i) continue;
      if(h[i]>=h[j]){
        result.push( h[j]*(Math.abs(j-i))  )
      }else{
        result.push( h[i]*(Math.abs(j-i)) )
      }
    }
  }
  return result.sort((a,b)=>b-a)[0]
  
}

getMaxArea([1, 8, 6, 2, 5, 4, 8, 3, 7] ) ==> 49
</script>

https://github.com/rumbarum/CodeKata/blob/master/Week2_Day5.md

profile
바스버거

0개의 댓글