[1주차 기본문제 3] 배열만들기 6

BossTeemo·2024년 6월 21일
0

알고리즘스터디

목록 보기
4/19
post-thumbnail

JavaScript 알고리즘 문제 풀이: 배열 조작 문제


문제 설명

0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만드려고 합니다.

i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다:

  1. 만약 stk이 빈 배열이라면 arr[i]stk에 추가하고 i에 1을 더합니다.
  2. stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고 i에 1을 더합니다.
  3. stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.

위 작업을 마친 후 만들어진 stk을 반환하는 solution 함수를 완성해 주세요. 단, 만약 빈 배열을 반환해야 한다면 [-1]을 반환합니다.


제한사항

  • 1 ≤ arr의 길이 ≤ 1,000,000
  • arr의 원소는 0 또는 1입니다.

입출력 예

arrresult
[0, 1, 1, 1, 0][0, 1, 0]
[0, 1, 0, 1, 0][0, 1, 0, 1, 0]
[0, 1, 1, 0][-1]

입출력 예 설명

입출력 예 #1

각 작업을 마친 후에 배열의 변화를 나타내면 다음과 같습니다.

idxarr[idx]stk
00[]
11[0]
21[0, 1]
31[0]
40[0, 1]
5-[0, 1, 0]

따라서 [0, 1, 0]을 반환합니다.

입출력 예 #2

각 작업을 마친 후에 배열의 변화를 나타내면 다음과 같습니다.

idxarr[idx]stk
00[]
11[0]
20[0, 1]
31[0, 1, 0]
40[0, 1, 0, 1]
5-[0, 1, 0, 1, 0]

따라서 [0, 1, 0, 1, 0]을 반환합니다.

입출력 예 #3

각 작업을 마친 후에 배열의 변화를 나타내면 다음과 같습니다.

idxarr[idx]stk
00[]
11[0]
21[0, 1]
30[0]
4-[]

마지막에 빈 배열이 되었으므로 [-1]을 반환합니다.


풀이

아래는 주어진 조건에 따라 stk 배열을 구성하고, 빈 배열일 경우 [-1]을 반환하는 solution 함수입니다.

function solution(arr) {
    var answer = [];
    let stk = [];
    
    for (let i = 0; i < arr.length; i++) {
        if (stk.length === 0) {
            stk.push(arr[i]);
        } else if (stk[stk.length - 1] === arr[i]) {
            stk.pop();
        } else {
            stk.push(arr[i]);
        }
    }
    
    answer = stk;
    if (answer.length === 0) {
        return [-1];
    } else {
        return answer;
    }
}

코드 설명

  1. 초기화: stk 배열을 빈 배열로 초기화합니다.
  2. 반복문: 배열 arr를 순회하면서 조건에 따라 stk 배열을 수정합니다.
    • stk이 빈 배열이면 arr[i]stk에 추가합니다.
    • stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 제거합니다.
    • stk의 마지막 원소가 arr[i]와 다르면 arr[i]stk에 추가합니다.
  3. 결과 반환: stk 배열이 빈 배열이면 [-1]을 반환하고, 그렇지 않으면 stk 배열을 반환합니다.

이 코드는 주어진 조건에 따라 배열을 적절히 수정하여 결과를 반환합니다. 배열이 빈 배열일 경우 [-1]을 반환하는 로직을 포함하고 있습니다.


ChatGpt 활용 코드평가

평가 기준

  1. 정확성: 문제의 요구사항을 정확히 충족하는가?
  2. 효율성: 코드의 시간 및 공간 복잡도가 제한 내에서 효율적인가?
  3. 가독성: 코드가 쉽게 읽히고 이해될 수 있는가?
  4. 유지보수성: 코드가 변경이나 확장에 용이한가?

코드 평가

  1. 정확성: 문제의 요구사항을 정확히 충족합니다. 배열을 올바르게 조작하고 빈 배열일 경우 [-1]을 반환합니다.
  2. 효율성: 시간 복잡도는 O(n)으로, 주어진 제한사항 내에서 효율적입니다. 공간 복잡도도 O(n)으로 적절합니다.
  3. 가독성: 코드가 비교적 읽기 쉽고 이해하기 쉽습니다. 하지만 중복된 조건문이 있어 조금 더 간결하게 작성할 수 있습니다.
  4. 유지보수성: 전반적으로 괜찮지만, 조건문에서 불필요한 중복을 제거하면 유지보수성이 더 좋아질 수 있습니다.

코드 첨삭

조건문에서 불필요한 중복을 제거하여 코드를 간결하게 만들겠습니다.

function solution(arr) {
    let stk = [];
    
    for (let i = 0; i < arr.length; i++) {
        if (stk.length === 0 || stk[stk.length - 1] !== arr[i]) {
            stk.push(arr[i]);
        } else {
            stk.pop();
        }
    }
    
    return stk.length === 0 ? [-1] : stk;
}

첨삭된 코드 설명

  1. 초기화: stk 배열을 빈 배열로 초기화합니다.
  2. 반복문: 배열 arr를 순회하면서 조건에 따라 stk 배열을 수정합니다.
    • stk이 빈 배열이거나 stk의 마지막 원소가 arr[i]와 다르면 stkarr[i]를 추가합니다.
    • 그렇지 않으면 stk의 마지막 원소를 제거합니다.
  3. 결과 반환: stk 배열이 빈 배열이면 [-1]을 반환하고, 그렇지 않으면 stk 배열을 반환합니다.

모범 답안

코드를 간결하게 만들고, 가독성을 높이기 위해 삼항 연산자를 사용하여 결과를 반환하는 방법도 좋은 선택입니다.

function solution(arr) {
    let stk = [];
    
    for (let i = 0; i < arr.length; i++) {
        if (stk.length === 0 || stk[stk.length - 1] !== arr[i]) {
            stk.push(arr[i]);
        } else {
            stk.pop();
        }
    }
    
    return stk.length === 0 ? [-1] : stk;
}

모범 답안 설명

  1. 초기화: stk 배열을 빈 배열로 초기화합니다.
  2. 반복문: 배열 arr를 순회하면서 조건에 따라 stk 배열을 수정합니다.
    • stk이 빈 배열이거나 stk의 마지막 원소가 arr[i]와 다르면 stkarr[i]를 추가합니다.
    • 그렇지 않으면 stk의 마지막 원소를 제거합니다.
  3. 결과 반환: stk 배열이 빈 배열이면 [-1]을 반환하고, 그렇지 않으면 stk 배열을 반환합니다.

결론

당신의 코드는 문제의 요구사항을 정확히 충족하며, 효율적으로 작성되었습니다. 조건문에서 불필요한 중복을 제거하여 코드를 간결하게 만들면 더 좋습니다. 모범 답안은 가독성과 효율성을 고려하여 작성된 코드로, 유사한 문제를 해결할 때 참조할 수 있습니다.

profile
1인개발자가 되겠다

0개의 댓글