소소한 개발 공부
[프로그래머스] 문자열 뒤집기 string, reverse 본문
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;
}
이것도 참 예쁘다.
'프로그래밍 > C & C++' 카테고리의 다른 글
[프로그래머스] 소인수분해 unique, erase (0) | 2022.10.25 |
---|---|
[프로그래머스] 특정 문자 제거하기 string.find, string.replace (0) | 2022.10.21 |
[프로그래머스] 문자열안에 문자열 string.find, string::npos (0) | 2022.10.21 |
error : 'char' is promoted to 'int' when passed through '...' (0) | 2021.02.02 |
strlcat()의 사용 (0) | 2020.12.01 |