본 페이지는 C++ 독학을 위해 작성한 포스트입니다 풀이과정도 포함되어있지만 문법공부에 대한 비중이 있습니다.
(+ Java언어 내용도 포함되어있을 수 있습니다. )
https://school.programmers.co.kr/learn/courses/30/lessons/120888
1.문제설명
문제 설명
문자열 my_string 이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고
하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string ≤ 110
my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
대문자와 소문자를 구분합니다.공백(" ")도 하나의 문자로 구분합니다.
중복된 문자 중 가장 앞에 있는 문자를 남깁니다.
2. 문제해결 접근
- 이중포문을 이용해 문자열을 검사한다,
- 내부의 반복문으로 문자열의 중복을 비교하되, 초기의값을 남겨둬야 하므로, 초기값은 i+1로 설정한다.
- 조건문으로 중복된 값은 배열에서 제거해준다.
1차시도..
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
string solution(string my_string) {
string answer = "";
for( int i = 0 ; i < my_string.size(); i++){
for ( int j = i+1; j < my_string.size(); j++){
if( my_string[i] == my_string[j] )my_string.erase(my_string.begin()+j);
}
}
for (int i = 0; i < my_string.size(); i++)
{
answer += my_string[i];
cout << answer;
}
return answer;
}
뭐가 문제일까..
3.C++ 답안
다른사람의 풀이를 통해 확인해본 답안!
1.이중포문을 이용한 답안
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string my_string) {
for(int i = 0; i<my_string.length(); i++)
{
for(int j = i + 1; j<my_string.length(); j++)
{
if(my_string[i] == my_string[j]) {
my_string.erase(my_string.begin() + j);
j--;
}
}
}
return my_string;
}
..중복된 값이 확인되어 , my_string.erase(my_string.begin() + j);
에서 값이 삭제될 경우,
다음 문자열이 앞으로 당겨지므로, 위와같이 검사를 진행을 이어가면, 1개의 값이 넘겨뛰어진다.
그러므로 ..
j-- 통해 인덱스를 조정해줘야 한다.
if(my_string[i] == my_string[j]) {
my_string.erase(my_string.begin() + j);
j--;
}
2.find() 함수이용 답안
#include <string>
#include <vector>
using namespace std;
string solution(string my_string) {
string answer = "";
for(int i = 0; i < my_string.size(); i++)
{
if(my_string.find(my_string[i]) == i)
answer.push_back(my_string[i]);
}
return answer;
}
5. C++ 문법 설명과 표현법
find() 함수의 활용
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val);
범위 ( Vector, Array ) 안에서 원하는 값을 찾는 함수
범위 안의 원소들 중 val과 일치하는 첫 번째 원소를 가리키는 반복자를 리턴한다.
위의 답안 코드에서는 조건으로서 활용하여,
찾고자 하는 문자의 인덱스를 반환하여, for문의 i와 일치할 경우, 값을 넣어주는 형태로 로직을 구성하였다.
예를들어 _ 인자가 "We are the world" 로 입력되었을 경우,
answer.push_back(my_string[i]);
로 찾아지는 인덱스는, 인자로 들어가는 문자중 최초로 찾은 문자의 인덱스를 반환하여,
중복되는 값이 나오기전까지 해당값이 계속해 answer에 새로운 값으로 추가되어(push_back)진다
중복되는 값이 발견될 경우, 다음 값으로 넘어가 검사하여 새로운 값만 추가하게 된다.
참고한 웹 페이지
https://dkanxmstmdgml.tistory.com/59
'알고리즘 > [프로그래머스]Lv.0' 카테고리의 다른 글
[프로그래머스]Lv 0. 인덱스 바꾸기 (0) | 2022.11.07 |
---|---|
[프로그래머스]Lv 0. 문자열 정렬하기 (1) (0) | 2022.11.07 |
[프로그래머스]Lv0. 숨어있는 숫자의 덧셈 (1) (0) | 2022.11.03 |
[프로그래머스]Lv0. 문자열안에 문자열 (0) | 2022.11.03 |
[프로그래머스]Lv0. 두 수의 나눗셈 (0) | 2022.11.03 |