557. Reverse Words in a String III

mmmYoung·2022년 3월 16일
0

리트코드

목록 보기
13/21

문제 설명

Given a string s, reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.

문자열 s가 주어지면, 문장 내 단어들을 reverse하여라. 단 공백과 첫 문자를 유지해야 한다. (단어 첫 대문자를 의미하는 것 같다.)

출력예시

접근 방법

첫번째 시도

문자열을 문자마다 탐색하여 공백이 등장할 때마다 단어를 뒤집고 출력 문자열에 삽입해서 출력하는 방법 => 성공했지만 시간과 메모리 크기 모두 비효율적

        for(auto character:s){
            if(character == ' ') {
                reverse(word.begin(),word.end());
                answer = answer + word +" ";
                word.clear();
            }
            else word+=character;
        }
        reverse(word.begin(),word.end());
        answer += word;
        return answer;

두번째 시도

문자열을 in place로 뒤집는 방법 생각하기... reverse 함수의 범위를 컨트롤하여 수정할 수 있다는 점을 토대로 코드를 약간 수정하였다.

소스코드

class Solution {
public:
    string reverseWords(string s) {
        int start = 0;
        int end;
        int len = s.length();
        
        for(int i=0; i<len; i++){
            if(s[i] == ' ') {
                reverse(s.begin()+start,s.begin()+i);
                start = i + 1;
            }
        }
        reverse(s.begin()+start,s.end());
        return s;
    }
};

돌아보기

첫번째 시도에서 두번째 시도로 변경했더니
시간 141ms -> 18ms
메모리 269MB -> 9MB 까지 감소!
두 코드가 거의 유사하게 진행되는데 이렇게까지 크게 차이가 날 줄은 몰랐다.
하나 하나 과정을 풀어쓰는 것 보다 라이브러리 함수를 이용하고, in place로 진행 할 수 있는 방법이 있을 지 항상 생각해보기

profile
안냐세여

0개의 댓글