연습장

40. 문자열 여러 번 뒤집기 본문

프로그래머스/0단계

40. 문자열 여러 번 뒤집기

js0616 2023. 6. 24. 01:53

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

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


my_string 문자열을 대상으로 queries의 원소에 [s , e] 의 값 에 따라서 문자를 뒤집으면 된다.

 

간단한 예시를 보면

ex) my_string = "abcde"

queries = [1,3] 일경우

result = "adcbe" 가 된다 .

 

다시 문제로 와서 queries 의 원소만큼 위의 입출력 예시는 4번 반복하며

일반화하면 4번이라는것은 즉  배열의 모든 원소에 대해 실행한다고 볼 수 있다.

 

단순 for 문으로 풀어보자면 

 

queries =  [[2, 3]] 에대해

my_string[2] 와 my_string[3] 의 자리를 바꿔준다고 볼 수 있다. 

        let my_string = "rermgorpsam"
        let queries = [[2, 3]]

        let my_list = [...my_string]

        for (let i = 0; i < queries.length; i++) {
            let s = queries[i][0] ;
            let e = queries[i][1] ;
            let temp = 0  ;
            temp = my_list[s];
            my_list[s] = my_list[e]
            my_list[e] = temp
        }
        console.log("변경 :",my_list)
        // 변경 : (11) ['r', 'e', 'm', 'r', 'g', 'o', 'r', 'p', 's', 'a', 'm']

 

그렇다면 queries =  [[2, 3], [0, 7], [5, 9], [6, 10]] 에 대해서는 어떻게 될까

i가 1일때는 

 

queries = [0,7] 이며

my_string[0] <--> my_string[7]

my_string[1] <--> my_string[6]

my_string[2] <--> my_string[5]

my_string[3] <--> my_string[4]

 

총 4번 자리를 바꿔야한다. 

s (start) 는 1씩 커지고 

e (end) 는 1씩 작아지는것을 알 수있다.

 

그리고 s가 e 보다 크면 종료가 된다. 

 

i가 2일때는

queries = [5,9] 이며 한번더 적어보면

my_string[5] <--> my_string[9]

my_string[6] <--> my_string[8]

my_string[7] <--> my_string[7]

 

s 가 1씩 증가 , e 는 1씩 감소

s == e 일때 종료 

 

총 2가지의 경우가 있는데 하나로 줄여보자면

받아온 [s, e ] 에 대해서

s >= e 일때가 종료 조건이며 -> s < e 이면 바꿔줘야한다. 

반복하는경우 s++  , e-- 의 변화를 가진다.

 

따라서 횟수는 잘모르겠지만, 조건에 따라 반복하는 경우 -> while 문을 사용

 

let my_string = "rermgorpsam"
        let queries = [[2, 3], [0, 7], [5, 9], [6, 10]]

        let my_list = [...my_string]

        for (let i = 0; i < queries.length; i++) {

            let s = queries[i][0];
            let e = queries[i][1];
            let temp = 0;

            while (s < e) {
                temp = my_list[s];
                my_list[s] = my_list[e]
                my_list[e] = temp
                s++
                e--
            }
           

        }
        console.log("변경 :", my_list)
        // 변경 : (11) ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'e', 'r', 's']

my_string = "rermgorpsam"  으로 주어진 input 에 대해서

my_list = ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'e', 'r', 's'] 로 잘 나오는것이 확인된다. 

 


코드 줄여보기 

queries 를 다 돌면서 진행한다. -> 배열을 모두 순회 한다. -> forEach 를 사용

forEach 안에서 while 문을 도는 구조로 작성하였다. 

let my_string = "rermgorpsam"
        let queries = [[2, 3], [0, 7], [5, 9], [6, 10]]
        let my_list = [...my_string]
        queries.forEach( ([s,e])=> {
            while ( s < e){
                [my_list[s], my_list[e]] = [my_list[e], my_list[s]]
                s++
                e--
            }
        })
        console.log(my_list)
        // 변경 : (11) ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'e', 'r', 's']

고찰. 

각각 프로그래머스 사이트에 정답을 제출했더니 다음과 같은 결과를 가진다. 

용량은 비슷한데 속도의 차이를 가진다. 물론 인터넷 상태에 따라 달라질 수 있겠지만. 

 

인터넷에 검색해본 결과

for loop > reduce > foreach > map  순으로 속도가 빠르다고 한다. 

for 문이 줄수가 더 길지만,  forEach 보다 빠른 속도가 난다는 점이 흥미로웠다. 

 

 

'프로그래머스 > 0단계' 카테고리의 다른 글

42. 부분 문자열 이어 붙여 문자열 만들기  (0) 2023.06.25
41. 배열 만들기 5  (0) 2023.06.25
39. 9로 나눈 나머지  (0) 2023.06.24
38. 글자 이어 붙여 문자열 만들기  (0) 2023.06.24
37. 주사위 게임 3  (0) 2023.06.24