소소한 개발 공부

[프로그래머스] 문자열 뒤집기 string, reverse 본문

프로그래밍/C & C++

[프로그래머스] 문자열 뒤집기 string, reverse

이내내 2022. 10. 21. 16:30

https://school.programmers.co.kr/learn/courses/30/lessons/120822

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열 my_string을 뒤집는 문제이다.

가장 처음 아이디어는 뒤에 있는 문자부터 한 개씩 새로운 문자열에 넣어 뒤집는 것이었다.

그 보다 나은 아이디어는 문자열 반절을 기준으로 swap 하는 것이어서 두번째 아이디어를 사용해 문제를 풀었다.

 

string solution(string my_string) {
    for (int i=0; i<my_string.length()/2; i++)
    {
        char c = my_string[i];
        my_string[i] = my_string[my_string.length() - i - 1];
        my_string[my_string.length() - i - 1] = c;
    }
    return my_string;
}

다른 사람의 풀이를 보니 정말 깔끔하고 아름다운 코드가 많았다.

 

string 생성자 사용

string 생성자를 사용해 뒤집은 문자열을 새로 생성해 반환한다.

https://cplusplus.com/reference/string/string/string/

 

https://cplusplus.com/reference/string/string/string/

substring (3)string (const string& str, size_t pos, size_t len = npos);

cplusplus.com

default (1)	
string();

copy (2)	
string (const string& str);

substring (3)	
string (const string& str, size_t pos, size_t len = npos);

from c-string (4)	
string (const char* s);

from buffer (5)	
string (const char* s, size_t n);

fill (6)	
string (size_t n, char c);

range (7)	
template <class InputIterator>  string  (InputIterator first, InputIterator last);

initializer list (8)	
string (initializer_list<char> il);

move (9)	
string (string&& str) noexcept;

여기서 7번처럼 iterator를 이용해 string의 맨 마지막 글자부터 첫번째 글자까지 새로운 string 안에 넣을 수 있다.

string solution(string my_string) {
    return string(my_string.rbegin(), my_string.rend());
}

 

와!

 

Reverse 함수

reverse 함수는 algorithm 헤더에 포함된 함수로 vector나 string 등을 반전시키는 함수이다.

https://cplusplus.com/reference/algorithm/reverse/?kw=reverse 

 

https://cplusplus.com/reference/algorithm/reverse/?kw=reverse

12345678 template void reverse (BidirectionalIterator first, BidirectionalIterator last) { while ((first!=last)&&(first!=--last)) { std::iter_swap (first,last); ++first; } }

cplusplus.com

함수 내부 동작은 아래와 같은데, iterator를 통해 자료구조를 탐색하면서 앞 데이터와 뒤 데이터의 swap을 수행한다.

template <class BidirectionalIterator>
  void reverse (BidirectionalIterator first, BidirectionalIterator last)
{
  while ((first!=last)&&(first!=--last)) {
    std::iter_swap (first,last);
    ++first;
  }
}

 

이를 이용한 solution 코드는 아래와 같다.

#include <algorithm>

string solution(string my_string) {
	reverse(my_string.begin(), my_string.end());
	return my_string;
}

이것도 참 예쁘다.