#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칸을 이동해버리기 때문이다.
'알고리즘 문제' 카테고리의 다른 글
[알고리즘 문제] 백준2798 - 블랙잭 (0) | 2020.08.22 |
---|---|
[알고리즘 문제] 백준2309 - 일곱 난쟁이 (0) | 2020.08.22 |
[알고리즘문제] 프로그래머스 - N으로 표현 (0) | 2020.04.17 |
[알고리즘 문제] 백준2225 - 합분해 (0) | 2020.04.10 |
[알고리즘 문제] 백준9461 - 파도반 수열 (0) | 2020.04.10 |