본문 바로가기
알고리즘 문제

[알고리즘문제] 프로그래머스 - 스킬 체크 테스트 level 1

by 박연호의 개발 블로그 2020. 4. 18.

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    
    while(n!=1){
        if(answer==500){
            return -1;
        }
        if(n%2==0){
            n/=2;
        }else if(n%2==1){
            n*=3;
            n++;
        }
        answer++;
    }
    return answer;
}

n을 1로 만드는데 아래의 두가지 연산을 통해 몇번만에 만들 수 있는지 출력하는 문제이다. 만약 연산의 횟수가 500을 넘어가면 그냥 -1을 return 한다.

 

1. 입력된 수가 짝수라면 2로 나눈다.

2. 입력된 수가 홀수라면 3을 곱하고 1을 더한다.

 

단순히 입력받은 n을 홀/짝인지에 따라 연산을 하면 되는 간단한 문제이다.

 

 

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

string solution(string s, int n) {

    for(int i=0;i<s.size();i++){

        if(s[i]==32){ // ' '인 경우는 제외
            continue;
        }

        int num = s[i]+n;

        if(s[i] < 91){ // 대문자인 경우
            if(num > 90){
                num = num % 90 + 64;
            }
            s[i] = (char)num;
        }else{ // 소문자인 경우
            if(num > 122){
                num = num % 122 + 96;
            }
               s[i] = (char)num;
        }   
    }
    cout << s;
    return s;
}

문자열의 각 알파벳을 오른쪽으로 n번 밀면 된다. 예를 들어 n이 2인 경우 'C' -> 'E'가 된다. 만약  'z'인 경우 오른쪽으로 밀면 다시 'a'로 간다. 문제를  푸는데 아스키 코드를 사용했다. 중요한 점은 z를 넘어가는 경우인데, 이는 각 대/소문자 아스키값의 최대값을 나눈 나머지에 대/소문자의 가장 최소값-1을 더해주었다. 여기서 -1을 한 이유는, z->a가 되면 한칸 이동하는 건데 실제로 2칸을 이동해버리기 때문이다.