[1주차 기초문제 1] 문자열 여러번 뒤집기

BossTeemo·2024년 6월 21일
0

알고리즘스터디

목록 보기
2/19
post-thumbnail

문자열 여러 번 뒤집기 문제 풀이


문제 설명

문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다.
queries의 원소는 [s, e] 형태로,
my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다.
my_stringqueries의 명령을 순서대로 처리한 후의 문자열을 반환하는 solution 함수를 작성해 주세요.

제한사항

  • my_string은 영소문자로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • queries의 원소는 [s, e]의 형태로 0 ≤ se < my_string의 길이를 만족합니다.
  • 1 ≤ queries의 길이 ≤ 1,000

입출력 예

my_stringqueriesresult
"rermgorpsam"[[2, 3], [0, 7], [5, 9], [6, 10]]"programmers"

입출력 예 설명

예제 1번의 my_string은 "rermgorpsam"이고 주어진 queries를 순서대로 처리하면 다음과 같습니다.

  1. 초기 문자열: "rermgorpsam"
  2. [2, 3]: "remrgorpsam"
  3. [0, 7]: "progrmersam"
  4. [5, 9]: "prograsremm"
  5. [6, 10]: "programmers"

따라서 "programmers"를 반환합니다.


내 풀이

문제 해결을 위해 다음과 같은 절차를 따랐습니다:

  1. 문자열을 배열로 변환하여 각 문자에 쉽게 접근할 수 있도록 합니다.
  2. queries 배열의 각 명령을 순서대로 처리하여 부분 문자열을 뒤집습니다.
  3. 뒤집은 부분 문자열을 원래 배열에 덮어씁니다.
  4. 최종 배열을 다시 문자열로 변환하여 결과를 반환합니다.

코드 구현

function solution(my_string, queries) {
    var answer = '';
    let charArray = my_string.split('');
    let subArray = [];
    for(let i = 0; i < queries.length; i++) {
        let s = queries[i][0];
        let e = queries[i][1];
        subArray = charArray.slice(s, e + 1).reverse();
        
        for (let k = 0; k < subArray.length; k++) {
            charArray[s + k] = subArray[k];
        }
    }
    answer = charArray.join('');
    return answer;
}

코드 설명

  1. my_string.split('')을 사용하여 문자열을 문자 배열로 변환합니다.
  2. queries 배열을 순회하면서 각 쿼리의 시작 인덱스 s와 끝 인덱스 e를 추출합니다.
  3. slice 메서드를 이용하여 s부터 e까지의 부분 배열을 추출하고, reverse 메서드를 사용하여 뒤집습니다.
  4. 뒤집은 배열을 원래 charArray의 해당 위치에 덮어씁니다.
  5. 마지막으로, 배열을 다시 문자열로 변환하여 반환합니다.

이 방법을 통해 문제의 요구사항을 충족하는 올바른 결과를 얻을 수 있습니다. 예제에서 주어진 "rermgorpsam" 문자열과 queries를 순서대로 처리하여 "programmers"라는 결과를 성공적으로 반환합니다.

실행 결과

아래는 프로그래머스 플랫폼에서 테스트 케이스를 통과한 결과입니다.

테스트 결과, 정확성 100%를 달성하며 모든 테스트 케이스를 통과하였습니다.


ChatGpt 활용: 코드평가

ChatGPT를 활용하여 코드를 평가하고, 모범답안을 출력해보았습니다.

모범 답안

문제의 요구사항을 충족하고 효율적으로 문제를 해결하기 위해 배열을 사용하여 부분 문자열을 뒤집는 방법이 모범 답안으로 제시됩니다.

function solution(my_string, queries) {
    // 문자열을 변형하기 위해 배열로 변환
    let result = my_string.split('');
    
    for (const [s, e] of queries) {
        // 부분 문자열을 뒤집기
        while (s < e) {
            [result[s], result[e]] = [result[e], result[s]];
            s++;
            e--;
        }
    }
    
    // 배열을 문자열로 변환하여 반환
    return result.join('');
}

모범 답안 설명

  1. 문자열을 배열로 변환: my_string.split('')을 사용하여 문자열을 배열로 변환합니다.
  2. 쿼리 순회: 각 쿼리를 순회하면서 [s, e]를 구조 분해 할당을 통해 추출합니다.
  3. 부분 문자열 뒤집기: 쿼리의 시작 인덱스 s와 끝 인덱스 e 사이의 부분 문자열을 뒤집습니다. 배열의 요소를 교환하여 뒤집기를 수행합니다.
  4. 문자열로 변환하여 반환: 최종적으로 배열을 다시 문자열로 변환하여 반환합니다.

내 코드에 대한 평가

당신의 코드는 문제를 정확히 해결하고 모든 테스트 케이스를 통과했습니다. 다음은 당신의 코드에 대한 평가입니다.

평가 기준

  1. 정확성: 모든 테스트 케이스를 통과하며, 문제의 요구사항을 정확히 충족합니다.
  2. 효율성: 시간 복잡도와 공간 복잡도 측면에서 적절하지만, 배열 조작을 함수로 분리함으로써 코드의 재사용성을 높일 수 있습니다.
  3. 가독성: 코드가 비교적 깔끔하고 이해하기 쉬우며, 변수명도 적절하게 사용되었습니다.
  4. 유지보수성: 배열 조작 부분을 함수로 분리하면 유지보수성과 재사용성이 더욱 향상됩니다.

코드 첨삭 후 최종 코드

function solution(my_string, queries) {
    var answer = '';
    let charArray = my_string.split('');
    
    // 범위를 뒤집는 함수
    function reverseSubArray(arr, start, end) {
        while (start < end) {
            // 요소를 서로 교환
            [arr[start], arr[end]] = [arr[end], arr[start]];
            start++;
            end--;
        }
    }

    for (let i = 0; i < queries.length; i++) {
        let s = queries[i][0];
        let e = queries[i][1];
        reverseSubArray(charArray, s, e);
    }
    
    answer = charArray.join('');
    return answer;
}

코드 첨삭 설명

  1. 변수 초기화 유지: answer 변수의 초기화는 문제의 요구 사항에 따라 유지합니다.
  2. 함수화: reverseSubArray 함수를 추가하여 배열의 특정 범위를 뒤집는 기능을 별도로 분리했습니다. 이를 통해 코드의 가독성과 재사용성을 높였습니다.
  3. 구조 분해 할당: 배열 요소를 교환할 때 구조 분해 할당 문법을 사용하여 코드를 간결하게 했습니다.

결론

코딩 테스트 대비를 위해 작성된 코드로서 매우 잘 작성되었습니다. 일부 개선 사항을 반영하여 가독성과 유지보수성을 높일 수 있었습니다. 코딩 테스트에서는 정확성과 효율성뿐만 아니라 코드의 가독성과 유지보수성도 중요하기 때문에, 이러한 점들을 고려한 첨삭된 코드가 좋은 예시가 될 것입니다.

profile
1인개발자가 되겠다

0개의 댓글