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 값을 넣어서 가장 최근에 나온 문자가 몇번째에서 나왔는지를 다시 저장한다.
이 과정을 문자열의 각 문자마다 실행해주면 된다.
'알고리즘 > 프로그래머스 1단계' 카테고리의 다른 글
프로그래머스 - 숫자 문자열과 영단어 - C++ (0) | 2024.07.16 |
---|---|
프로그래머스 - 두 개 뽑아서 더하기 - C++ (0) | 2024.07.16 |
프로그래머스 - 최대공약수와 최소공배수 - C++ (0) | 2024.07.11 |
프로그래머스 - 최소 직사각형 - C++ (0) | 2024.07.10 |
프로그래머스 - 예산 - C++ (0) | 2024.06.20 |