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

 

프로그래머스

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

programmers.co.kr


문제 내용 :

0.인자값으로 s와 skip 이라는 알파벳 소문자 문자열과 index라는 int 정수값이 주어짐

1.s 문자열에 문자를 index 만큼의 뒤의 문자로 변환해야함

2.변환시에 skip이라는 문자열에 해당 문자가 있을경우 그 문자를 무시하고 한번 더 변환함

2-1.변환시 글자 'z'를 넘어가는경우 'a'부터 다시 시작

이때 변환되는 문자열을 return


풀이 : 

문제에서 소문자 알파벳만 사용하기에 'a'~'z'를 담고있는 알파벳 배열을 만들것,

skip문자열의 문자인 경우 배열에 넣지 않으며 알파벳 배열을 만든다.

 

그후 s문자열의 길이만큼 반복문을 순회하며

해당 단일문자가 알파벳배열의 어디 index에 있는지 찾고 

찾은 문자의 index에 인자값index을 더하여 위치를 찾는다.

만약 더한 index값이 알파벳배열의 수를 넘었을 경우 , 다시 'a'부터 시작하게 초기화 한후 찾는다.

 

그럼 최종으로 찾은 index값을 알파벳 배열에 넣어 answer에 추가시키면 된다.

 

코드영역

 

더보기
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;


string solution(string s, string skip, int index) {
    string answer = "";
    
    
    //sort 정렬 : 시간복잡도 N , 우선순위 큐 : 시간복잡도 : log n
    //이기에 우선순위큐를 이용하여 minheap으로 정렬함
    priority_queue<char,vector<char>,greater<char>> pq_skip;
    for(char ch : skip) {  pq_skip.push(ch);}
    
    
    char pivot = 'a'; //알파벳 배열에 넣을 시작 문자
    vector<char> alpabet;
    while(pivot <= 'z') 
    {
        //해당 알파벳이 skip문자열에 있는경우 알파벳 배열에 넣지 않는다.
        if( pq_skip.top() != pivot) { alpabet.push_back(pivot); }
        else { pq_skip.pop(); }
        pivot++;
    }
        
    //문자열 s 길이만큼 순회하며 문자를 변환한다.
    int result;
    for(int i = 0; s.size() >i;i++)
    {
        //문자열 s의 단일문자가 알파벳배열의 어디에 위치하는지 찾는다.
        int alpabet_index = find(alpabet.begin(),alpabet.end(),s[i]) - alpabet.begin();
        
        //찾은 단일문자위치에 인자값index를 더하여 최종 위치를 찾는다.
        result = alpabet_index + index;
        //만약 알파벳 사이즈를 초과한 경우 , 알파벳 사이즈만큼 뺀다.
        while(result> alpabet.size()-1 )
        {
            result -= alpabet.size();
        }
        
        answer += alpabet[result];
    }
    
    
    return answer;
}

해당 문제를 이렇게 풀었지만 , 다른 사람 풀이를 보니 더욱 가독성 좋고 쉽게 풀이한게 있어 코드를 첨부한다.

 

다른사람 풀이

#include <string>
#include <vector>

using namespace std;

string solution(string s, string skip, int index) {
    string answer = "";

    for(auto v : s)
    {
        int t = 0; //다음 문자로 넘어간 숫자를 카운트하는 변수
        int c = v - 'a'; //문자v에서 'a'를 뺌으로 알파벳의 위치순서를 파악
        while(t < index)
        {
            c++;//다음 알파벳위치(알파벳 변환)
            v = (c % 26) + 'a';//해당 알파벳 위치를 문자열로 변환(v는 char 자료형)
            //c%26은 알파벳이 총 26개 이기 때문에 큰 숫자가 들어와도 알파벳의 한 형태로 변환 가능하기떄문
            
            //skip문자열에 해당 문자(v)가 있는지 체크
            if(skip.find(v) == string::npos)
            {
            	//없으면 카운트를 증가시킴
                t++;
            }
        }
        
        answer += v;
    }
    return answer;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

LV3.디스크 컨트롤러  (0) 2024.04.08
LV2.가장 큰 수  (0) 2023.11.03
LV1.체육복  (0) 2023.10.26
LV2.택배상자  (0) 2023.10.26
LV2.롤케이크 자르기  (0) 2023.10.26

+ Recent posts