Javascript - 프로그래머스 15일차

이율곡·2023년 6월 23일

Programmers

목록 보기
15/44
post-thumbnail

15일차

20문제 남았다!. 83%를 달성했고, 얼마 남지 않았지만 그만큼 힘든 문제들만이 남았다. 다음 주까지 매일 4~5문제를 풀면 기초 트레이닝이 끝난다.

다음 단계로 나아가기 위해서는 남은 20문제를 어떻게 푸느냐에 따라 달렸기 때문에 매일 잘 기록하면서 다음 레벨을 위한 준비를 해야겠다.


오늘의 문제

조건에 맞게 수열 변환하기 2

문제 설명

정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.
단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.

입출력 예

arrresult
[1, 2, 3, 100, 99, 98]5

접근방법

이 문제에 대한 접근 방법은, arr에 대해 반복적으로 작업을 수행하면서 결과 배열을 생성하고, 생성된 배열이 이전 배열과 동일한지를 확인해야 한다.

  1. 주어진 배열 arr을 복사하여 결과 배열 result를 초기화.
  2. result 배열을 생성하기 위해 반복문 사용. 반복 횟수를 나타내는 변수 x를 0으로 초기화하고, 작업 결과를 저장할 배열 nextArr를 result의 복사본으로 초기화.
  3. nextArr 배열을 순회하면서 작업을 수행. 배열의 각 원소에 대해 조건에 따라 값을 변경한다.
  4. 작업이 완료된 nextArr 배열과 이전 result 배열을 비교하여 같은지 확인. 만약 같다면 x를 반환.
  5. 작업이 완료된 nextArr 배열을 result 배열로 갱신.
  6. x를 1 증가시킨 후 3단계부터 다시 반복.

풀이

function arraysEqual(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }

  for (let i = 0; i < arr1.length; i++) {
    if (arr1[i] !== arr2[i]) {
      return false;
    }
  }

  return true;
}

function solution(arr) {
  let x = 0;
  let result = [...arr];

  while (true) {
    const nextArr = [...result];

    for (let i = 0; i < nextArr.length; i++) {
      if (nextArr[i] >= 50 && nextArr[i] % 2 === 0) {
        nextArr[i] /= 2;
      } else if (nextArr[i] < 50 && nextArr[i] % 2 === 1) {
        nextArr[i] = nextArr[i] * 2 + 1;
      }
    }

    if (arraysEqual(nextArr, result)) {
      return x;
    }

    result = nextArr;
    x++;
  }
}

풀이를 위에서부터 차근차근 살펴보자.

우선 arraysEuqal 함수는 배열의 원소가 서로 같은지 확인하는 함수다. 원하는 것은 이전 배열과 현재 배열의 원소기 때문에,여기서 확인하여 boolean값을 반환하고 반복문을 계속 돌지 아닐지를 판단한다.

본문을 보면 가장 처음, 인덱스를 나타내는 x와 이전 배열을 나타내는 result를 초기화를 한다. 그리고 while 반복문을 통해 반복문을 돌면서 조건을 달성하고 이전배열과 현재 배열의 원소를 확인한다.

while문을 보면 가장 처음 nextArr 배열은 이전 배열을 다시 받아, nextArr를 조건에 맞게 변경을 한다. for문을 통해 문제에서 요구하는 조건에 맞게 nextArr를 변경하고, for문을 나오면 앞서 정의한 arraysEuqal함수를 통해 result와 nextArr를 비교한다. 같으면 x값을 리턴하여 while문을 끝내고 그렇지 않으면 result에 바뀐 nextArr를 넣어 다시 반복문을 돈다.


정리하기

15일차는 매우 깔끔한 문제를 푼 거 같아서 좋았다. 수학적 사고는 아니더라도, 코딩을 하는데 있어서 제일 베스트였던 문제였지 않을까싶다.

늘 문제를 접근하는 방법부터 잘 정의하며, 푸는 것은 그 다음이란 걸 알게 해준 문제다. 남은 20문제를 어떻게 푸냐의 따라 나의 다음 레벨이 결정되기 때문에 앞으로도 오늘과 같이 최대한 열심히 해보자.

profile
음악을 좋아하는 사람이 음악을 만들 듯, 개발을 좋아하게 될 사람이 쓰는 개발이야기

0개의 댓글