프로그래머스 조이스틱 - Level 2

Byungwoong An·2021년 6월 25일
0

문제

풀이전략

코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int solution(string name) {
	// 완성해야 하는 이름의 길이만큼 미리 벡터를 만듬
    vector<int> ret(name.length());
    for(int i=0; i<ret.size(); i++){
        int n = name[i] - 'A';
        // A부터 시작하여 가는게 빠른지 Z로 돌아가서 뒤로가는게 빠른지 찾기
        ret[i] = min(n, 26 - n);
    }
    int retSize = ret.size();
    int ans = 0;
    int start = 0;
    while(1){
        // 여기서 i는 몇칸 움직일 지를 결정하는 변수이다
        // 즉 i가 1이면 오른쪽, 왼쪽으로 1칸을 확인한다. 
        int i = 0;
        int left, right;
        
        while(i != retSize){
       	    //만약 start + i 가 name의 크기를 넘어서면 다시 앞에서부터 돌아오도록 만들어주는 조건
            if(start+i >= retSize){
                right = start+i - retSize;
                
            }
            else right = start + i;
            
            // i칸 만큼 움직여서 ans에 더해줘야 할 값을 찾으면 break
            if(ret[right] != 0){
                    start = right;
                    break;
            }
            
            if(start - i < 0){
                left = start - i + retSize;
            }
            else left = start - i;
            
            // i칸 만큼 움직여서 ans에 더해줘야 할 값을 찾으면 break
            if(ret[left] != 0){
                start = left;
                break;
            }
            // 찾을때 까지 i를 증가시켜준다. 
            i++;
        }
        // 만약 i가 retSize가 되면 더이상 찾을 값이 없다는 것이므로 break
        if(i== retSize) break;
        // 알파벳을 바꾸는데 걸리는 값 더해주기
        ans += ret[start];
        // 이동하는데 필요한 값 더해주기
        ans += i;
        // 필요한 만큼 알파벳으로 바꿔주면 0으로 만들어주기 
        ret[start] = 0;
        
    }
    
    return ans;
}

소감

이 문제는 내가 아직 부족하여 내 풀이말고 프로그래머스 맨 위에 나온 풀이는 잘 이해가 가지 못했다. 따라서 그냥 내 풀이도 결국 이중포문이기 때문에 ㅋㅋㅋㅋㅋ 내꺼를 더 확실하게 이해하는 것으로 넘어가야겠다. 문제가 개인적으로 좀 어려웠지만 잘 해결했다.

profile
No Pain No Gain

0개의 댓글