[프로그래머스] 가장 가까운 같은 글자

gcoco·2023년 5월 11일
0

안녕하세요! 파워에이드가 좋은 GCOCO입니다!


잡설 한 COOKIE🍪

여러분은 가까운 길을 멀게 돌아간다거나, 쉬운 문제를 어렵게 푸는것과 같이 간단한 일을 어렵게 처리해 보신적이 있나요?

제가 방금 그러고 왔습니다. 하하.

살다보면 이런 경우가 종종 있는것같습니다.
착각으로부터 시작하여 제대로 된 방향을 보지 못하고 흔들흔들 나아가는 것이지요.
그럼에도 불구하고 때로는 그 '나아감'에 집중하는것이 도움이 될 때도 있습니다.
물론 처음부터 올바른 방향으로 나아가는 것만큼 중요한 것도 없겠지만 결국 '목적지'를 향해 나아가는 것이 더 중요한 법이지요. 헤메도 괜찮습니다! 나아가십시오!

이번 문제 보도록 하겠습니다!


문제링크 :

옛풀이

#include <string>
#include <vector>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    string tmp;
    for (int i = 0; i < s.length(); i++) {
        if (tmp.find(s[i]) == string::npos) {
            answer.emplace_back(-1);
            tmp += s[i];
        }
        else {
            int j = i - 1;
            while (s[j] != s[i]) {
                j--;
            }
            answer.emplace_back(i - j);
        }
    }
    return answer;
}

이 문제 또한 예전에 푼 경험이 있습니다.
코드의 흐름은 다음과 같습니다.

  1. s의 글자를 순회한다.
  2. string tmp를 이용하여 처음 나온글자인지 아닌지 체크
  3. 만약 처음 나온 글자라면 tmp에 추가
  4. 처음 나온 글자가 아니라면 i보다 한칸 앞에서 부터 출발해 가장 가까운 글자를 확인 및 거리를 answe에 추가

위와 같이 되겠군요!


신풀이

#include <string>
#include <vector>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    vector<int> alpha(26,-1);
    for(int i=0;i<s.size();i++){
        int target= s[i]-'a';
        if(alpha[target]==-1){
            answer.emplace_back(-1);
            alpha[target]=i;
        }
        else{
            answer.emplace_back(i-alpha[target]);
            alpha[target]=i;
        }    
    }
    return answer;
}

제가 새롭게 푼 풀이는 위와 같습니다. step을 보자면

  1. alpha vector를 이용해 -1로 셋팅
  2. target의 index를 추출, 처음 나온 글자인지 확인하고 최근 index로 alpha를 업데이트
  3. 나왔던 글자라면 현재의 i값에서 마지막 인덱스인 alpha[target]을 빼주고 answer에 넣는다
  4. alpha[target] update

하하. 간단한 문제이지요? 하지만 제가 고생했던 부분은 바로 앞 뒤로 검사를 실시했습니다.
만약 'banaana'라는 글자가 있다면 4번째 글자인 a의 경우 2칸 앞에 a가 있고 한 칸 뒤에 a가 있지요? 그래서 가까운 글자인 뒤쪽 a의 거리인 1을 answer에 넣어야 하는구나! 라고 착각을 했습니다.

하지만 이 문제의 초반부엔, 이러한 말이 적혀있습니다.

"자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳"

오늘의 교훈. 문제를 잘 읽자.


작은 도움이 되었길 바라며, 포스팅 마치겠습니다!

profile
그코코 입니다.

0개의 댓글