알고리즘/프로그래머스 1단계

프로그래머스 - 가장 가까운 글자 - C++

게임만드는학생 2024. 7. 11. 13:49

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

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(string s) {
    vector<int> answer;
    int arr[26];
    for(int i=0;i<26;i++)
        arr[i]=-1;
    
    for(int i=0;i<s.length();i++)
    {
        
        if(arr[s[i]-'a']==-1)
        {
            answer.push_back(arr[s[i]-'a']);
            arr[s[i]-'a']=i;
        }
        else
        {
            answer.push_back(i-arr[s[i]-'a']);
            arr[s[i]-'a']= i;
        }
        
    }
    
    return answer;
}

 

주어진 문자열 s 에서 각 문자가 처음 나온건지 또 처음이 아니라면 가장 최근에 몇개의 문자 앞에서 나왔는지를 판단해서 

answer에 삽입하는 문제이다.

 

apple 이라면 

-1,-1,1,-1,-1 이 답이어야 한다.

 

a,p 는 처음 나왔고 그 다음 p 는 바로 앞에 p 가 나왔으니 1이고 l,e 도 처음 나왔기 때문이다.

 

각 문자가 나온 위치를 저장해놓기 위해 int형 배열의 크기를 26개로 만들었다. (스펠링 개수)

-1로 배열을 초기화 한다. 

 

문자를 숫자로 바꾸는 방법은 문자-'a' 를 하면 된다. (소문자일 경우, 대문자는 문자-'A')

arr[ 문자 - 'a' ] 의 값은 문자가 최근에 몇번째에서 나왔었는지를 구하기 위한 식이다. 

 

따라서 -1 이면 처음 나온 것이기 때문에 answer에 -1을 대입하고 i 위치를 배열에 넣어준다.

 

또 -1이 아니라면 answer에 i- arr[문자-'a'] 값을 넣어서 지금 이 문자가 몇번째 앞에서 또 나왔는지를 알 수 있다. 

따라서 뺀 값을 answer에 대입하고 배열에는 i 값을 넣어서 가장 최근에 나온 문자가 몇번째에서 나왔는지를 다시 저장한다. 

 

이 과정을 문자열의 각 문자마다 실행해주면 된다.