본문 바로가기

알고리즘/[프로그래머스]Lv.0

[프로그래머스]Lv 0. 중복된 문자 제거

 

본 페이지는 C++ 독학을 위해 작성한 포스트입니다 풀이과정도 포함되어있지만 문법공부에 대한 비중이 있습니다.
(+  Java언어 내용도 포함되어있을 수 있습니다. )

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

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

 

c++ algorithm] find ( ) 함수 사용법

template InputIterator find(InputIterator first, InputIterator last, const T& val); 범위 안에 원하는 값을 찾는 함수입니다. 범위 안 (first 부터 last 전 까지) 의 원소들 중 val 과 일치하는 첫 번째 원소를 가리키는

dkanxmstmdgml.tistory.com