어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾼 결과를 리턴하는 문제이다.

문자열 s와 거리 n을 입력받아, s를 n만큼 민 암호문을 만들어야 한다.

 

문제 자체는 어렵지 않았는데... 대문자->소문자, 소문자->대문자로 변환하는 과정이 어려웠다..

 

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";
    string temp = "";
    
    for(int i =0; i<s.size(); i++)
    {
        if(s[i] == ' ')
        {
            answer += " ";
        }
        else
        {
            temp = s[i];
            for(int j = 1; j <= n; j++)
            {
            	// 나머지 연산을 사용해서 대문자->소문자, 소문자->대문자 변환
                if(('A' <= s[i]) && (s[i] <= 'Z'))
                {
                    temp = (s[i]-'A'+j)%26 +'A';
                }
                else
                {
                    temp = (s[i]-'a'+j)%26+ 'a';
                }
            }
            answer += temp;
        }
    }
    return answer;
}

문자열 s를 입력받아서, 각 단어의 짝수 번째 알파벳은 대문자로, 홀수 번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 문제이다.

문자열 전체의 인덱스를 기준으로 하지 않고, 단어 별로 짝/홀수를 판단해야 한다.

 

처음에는 입력받은 문자열 s를 공백을 기준으로 잘라서 임시벡터에 넣고, 임시벡터를 기준으로 for문을 돌려서 풀었는데... 채점하니까 테스트 케이스가 일부 실패하는 현상이 있었다...

 

찾아보니 테스트 케이스 중에는 공백이 2개 이상인 것도 있었다..!!ㅜㅜ 나는 마지막에 공백을 제거해서 계속 실패했던 거였다...

ex)

입력값 : "   aaa  bbb cc  " 

출력값 : "   AaA  BbB Cc  "

 

그래서 공백을 기준으로 문자열을 나누지 않고, 아예 문자열 전체를 for문을 돌렸다.

문자를 대소문자로 변경할 기준인 test 플래그를 두고, 해당 플래그가 true이면 대문자로, false면 소문자로 변환했다.

입력받은 문자열에 공백이 있으면 리턴할 문자열 answer 에 공백을 더하고, test를 true로 변경했다.

(공백 다음에 오는 문자는 무조건 대문자여야 하니까..)

 

 

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    bool test = true;
    for(int i = 0; i<s.size(); i++)
    {
        if(s[i] == ' ')
        {
            answer += " ";
            test = true;
            continue;
        }
        if(test == true)
        {
            answer += toupper(s[i]);
            test = false;
        }
        else
        {
            answer += tolower(s[i]);
            test = true;
        }
    }
 
 	return answer;
 }

 

(기록용) 계속 실패했던 소스...

입력받은 문자열 s를 공백을 기준으로 잘라서 임시벡터에 넣은 후 각 문자들의 인덱스를 기준으로 짝수면 대문자로, 홀수면 소문자로 변경해줬다.

 

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
	vector<string> imsi;
    string temp;
    istringstream ss(s);
    
    while(getline(ss, temp, ' '))
    {
        imsi.push_back(temp);
    }
    
    for(int i = 0; i<imsi.size(); i++)
    {
        string temp2 = imsi[i];
        for(int j = 0; j <temp2.size(); j++)
        {
            if(j % 2 == 0)
            {
                answer += toupper(temp2[j]);
            }
            if(j % 2 != 0)
            {
                answer += tolower(temp2[j]);
            }
        }
        answer += " ";
    }
    
    answer.pop_back();
    return answer;
  }

입력받은 정수 n의 각 자릿수를 내림차순으로 정렬한 정수를 리턴하는 문제이다.

나는 정수 n을 string 으로 변환한 후, int 형 벡터에 집어넣고 sort 함수를 돌린 후 , 다시 string 변수에 집어넣은 다음 long long 형으로 변환했다....

 

그냥 string 문자열 만으로도 sort 함수를 사용할 수 있다는 것을 깜박했다... 굳이 벡터 변환 -> sort 수행 -> string 변환 할 필요가 없었는데ㅠ

 

#include <string>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    vector<int> temp;
    string s = to_string(n);

    for(int i = 0; i<s.size(); i++)
    {
        temp.push_back(s[i]-'0');
    }

    sort(temp.begin(), temp.end(), greater<int>());

    string cmp;
    for(int i = 0; i<temp.size(); i++)
    {
        cmp += to_string(temp[i]);
    }

    answer = stoll(cmp);
    return answer;
}

입력받은 자연수 n을 뒤집어서 각 자리 숫자를 원소로 가지는 배열 형태로 리턴하는 문제이다.

이전에 풀었던 '자연수 뒤집기' 처럼 나머지를 이용해서 풀면 된다.

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(long long n) {
    vector<int> answer;
    
    while(n!=0)
    {
        answer.push_back(n%10);
        n/=10;
    }
    return answer;
}

입력값으로 자연수 N이 주어진 경우, N의 각 자릿수의 합을 구하는 문제이다.

풀이에는 2가지 방법이 있다.

 

1) N을 문자열로 변환한 후 푸는 방식

 

int solution(int n)
{
    int answer = 0;
    string s = to_string(n);
    
    for(int i = 0; i< s.size(); i++)
    {
        answer += s[i] - '0';
    }
    return answer;
}

 

2) 나머지를 이용해 구하는 방식

 

#include <iostream>

using namespace std;
int solution(int n)
{
    int answer = 0;
    while(n != 0){
        answer += n % 10;
        n /= 10;
    }
    return answer;
}

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수 solution 을 완성하는 문제이다.

약수는 어떤 수를 나누어 떨어지게 하는, 0이 아닌 정수이다.

약수를 구하는 가장 쉬운 방법은 정수 n에 대해서 1부터 n 까지의 수로 모두 나누는 것이다.

나눈 후, 나머지가 0이 되게 만드는 수를 찾으면 된다.!

 

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    
    for(int i = 1; i <= n; i++)
    {
        if(n%i == 0)
        {
            answer += i;
        }
    }
    return answer;
}

arry, divisor 를 각각 입력받고, arry의 각 element 중 divisor로 나누어 떨어지는 값을 정렬한 배열을 반환하는 문제이다. (오름차순 정렬, 나누어 떨어지는 element 가 없다면 -1 반환)

나누어 떨어진다는 것은 나머지가 없다는 뜻이므로 divisor 로 나눈 나머지가 0인 숫자를 answer 벡터에 넣어주면 된다.

STL 의 내장함수인 sort() 함수를 사용하면 오름차순을 쉽게 적용할 수 있다.

 

#include <string>
#include <vector>
#include<algorithm>

using namespace std;

vector<int> solution(vector<int> arr, int divisor) {
    vector<int> answer;
    for(int i = 0; i<arr.size(); i++){
    	// divisor 로 나누어 떨어지는 수만 answer 벡터에 넣는다.
        if(arr[i] % divisor == 0){
            answer.push_back(arr[i]);
        }
    }

	// 오름차순 정렬
    sort(answer.begin(), answer.end());

	// 나누어 떨어지는 원소가 없으면 -1 반환
    if(answer.empty()){
        answer.push_back(-1);
    }
    return answer;
}

 

 

 

입력받은 숫자 arr 에 대해서, 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거해야 하는 문제이다.

arr의 맨 처음 값을 answer 벡터에 넣어주고, answer 벡터의 값과 arr 벡터의 값 비교 후 다른 경우에만 answer 벡터에 넣어준다.

#include <vector>
#include <iostream>

using namespace std;

vector<int> solution(vector<int> arr) 
{
    //결과 값을 담는 int형 벡터 answer
    vector<int> answer;

    int cnt = 0;
    answer.push_back(arr[0]);
    
    for(int i = 1; i < arr.size(); i++)
    {
        int answer_num = answer[cnt];
        int arr_num = arr[i];
        
        if(answer_num == arr_num)
        {
            continue;
        }
        else
        {
            answer.push_back(arr[i]);
            cnt++;
        }
    }
    return answer;
}

+ Recent posts