코드카타 Day1

DevOps 블로그·2021년 12월 13일
0

문제
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개 밖에 없다고 가정하겠습니다.
  • 문제 해결 사고방식
    처음에는 반복문을 활용하여 단순히 nums[i], nums[i+1]를 더하고 그것을 비교하는 식으로 값을 구하려 했으나, 그러한 방식은 숫자가 순차적일 경우에만 더하는 것이 가능하고 nums[0]과 nums[3]과 같은 혹은 이상의 차이가 나는 2개의 배열을 더할 수 없는 문제가 있었다.
    그래서 그 다음으로는 한것은 배열의 길이 4정도 되는 임의 배열을 있다고 생각하고 모든 경우의 수를 전부 적어보았다.
    ex) [4, 9, 11, 14]라는 배열이 있다면,
  1. n + (n+1)
  2. n + (n+2)
  3. n + (n+3)
  4. (n+1) + (n+2)
  5. (n+1) + (n+3)
  6. (n+2) + (n+3)
    총 6가지 경우의 수가 나왔다. 그리고 이것을 보니 왠지 패턴이 보여일 것만 같았다. 그러다가 떠오른 생각이 첫번 째 값을 고정시키고 그 뒤에 나오는 배열의 다른 값들을 모두 더하고, 그 다음에 또 두 번째 값을 고정 시키고, 그 다음에 나오는 배열들을 더해서 target이 나오는지 비교를 해서 if문으로 리턴을 해주면 된다는 생각에 도달했다. 그래서 for문을 두번 쓰고 console을 돌려보았다.

    그러니 한가지 더 문제가 생겼다. 바로 자기 자신도 더한다는 문제가 생겼다. 그래서 이문제는 어떻게 해결하면 고민하다가 if문을 활용해서 없앴고 원하는 값을 얻었다.

    최종 쓴 코드와 결과는 아래와 같다.
const twoSum = (nums, target) => {
  // 아래 코드를 작성해주세요.
  

  for(let i = 0; i < nums.length; i++){
      // console.log(nums[i]);
    for(let j = 0; j < nums.length; j++){
      // console.log(i,j)
        if(i!=j){
          if(nums[i]+nums[j] === target){
            //console.log(i,j)
            return [i, j];
          }
        }
    }
  }
      
}

twoSum([0,1,2,3,4], 6);
module.exports = { twoSum };


  • 깨달은 점
    결국 코딩 또한 논리적인 사고의 결과물이고, 차근차근 하나씩 콘솔을 찍어가보면서 사고를 확장해나가면 문제를 해결할 패턴을 찾을 수 있다. 침착하게 패턴을 찾는 것을 즐기는 자세를 견지하면 된다. 어떤 방식으로 문제를 풀지를 고민하는 것은 수학과 비슷하나 다른 느낌이다. 예전에 풀던 창의성 문제나 IQ문제와 비슷한 느낌이다. 그래서 조금 즐겁다.
profile
IT 엔지니어를 향해 살아가는, 공부하는 기록들을 모아두고 있습니다.

0개의 댓글