[프로그래머스 Level1] 문자열 2

Wonjun·2022년 6월 7일
0
post-thumbnail

📝 문자열 내림차순으로 배치하기

문제 설명

문자열 내림차순으로 배치하기

해결 방법

문제 그대로 내림차순으로 배치하면 된다. 아스키 코드 값을 따져봐도 대문자가 소문자보다 작다.
string에서도 begin() end()를 사용할 수 있다.
여러가지 정렬 알고리즘이 있는데 그것을 활용하여 구현하기보다
C++ STL sort() 함수를 사용하여 간단하게 정렬할 수 있다.

💻소스코드

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

using namespace std;

string solution(string s) {
    string answer = s;
    sort(answer.begin(), answer.end(), greater<char>());
    return answer;
}

📝 문자열을 정수로 바꾸기

문제 설명

문자열을 정수로 바꾸기

해결 방법

약식 atoi 함수 구현 문제인 듯하다
+, - 부호를 판별해주는 sign 변수를 선언했다. 이는 s[0]이 음수이면 -1이 될 것이다.
문자를 숫자로 바꾸는 방법은 아스키 문자 '0'을 빼주면 된다. '0'은 아스키 코드로 48이다.
자릿수를 올려주기 위해 answer에 10씩 곱하면서 s[i] - '0' 을 더해준다.
마지막으로 계산된 answer와 sign을 곱한 값을 return하면 된다.

stoi 함수를 써서 한줄로 풀이할 수도 있다...
int answer = stoi(s);

💻소스코드

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int sign = 1;
    if (s[0] == '-')
        sign = -1;
    for(int i = 0; i < s.length(); i++){
        if ('0' <= s[i] && s[i] <= '9')
            answer = answer * 10 + (s[i] - '0');
    }
    return sign * answer;
}

📝 시저 암호

문제 설명

시저 암호

해결 방법

n만큼 밀기의 결과로 알파벳의 범위를 초과하는 경우를 생각해서 알파벳 string을 만들어 인덱싱하여 해결했다. 소문자는 lowercase에 담았고 대문자는 uppercase에 담았다.
s[i]가 소문자라면 lowercase에서 가져와 answer에 붙이고 대문자라면 uppercase에서 가져온다. 공백이라면 그대로 answer에 붙인다.

💻소스코드

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";
    string lowercase = "abcdefghijklmnopqrstuvwxyz";
    string uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for(int i = 0; i < s.length(); i++){
        if ('a' <= s[i] && s[i] <= 'z')
            answer += lowercase[(s[i] - 'a' + n) % 26];  // 소문자 밀기
        else if ('A' <= s[i] && s[i] <= 'Z')
            answer += uppercase[(s[i] - 'A' + n) % 26];  // 대문자 밀기
        else
            answer += s[i]; // 공백
    }
    return answer;
}

📝 문자열 내 p와 y의 개수

문제 설명

문자열 내 p와 y의 개수

해결 방법

p, P의 개수를 담는 pcnt 변수와 y, Y의 개수를 담는 ycnt 변수를 선언한다.
string s에 p, P가 있으면 pcnt++, y, Y가 있으면 ycnt++
이후 pcnt와 ycnt를 비교해서 같으면 true를 return하고 같지 않다면 false를 return한다.

💻소스코드

#include <string>
#include <iostream>
using namespace std;

bool solution(string s)
{
    bool answer = true;
    int pcnt = 0, ycnt = 0;
    for (int i = 0; i < s.length(); i++){
        if (s[i] == 'p' || s[i] == 'P')
            pcnt++;
        else if (s[i] == 'y' || s[i] == 'Y')
            ycnt++;
    }
    if (pcnt == ycnt)
        answer = true;
    else
        answer = false;
    return answer;
}

📝 이상한 문자 만들기

문제 설명

이상한 문자 만들기

해결 방법

단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야하므로 공백이 나올 때마다 공백을 answer에 붙이고 idx를 0으로 초기화시킨 후 i는 continue를 통해 다음으로 넘겨준다. idx가 짝수 번째라면 toupper() 또는 아스키 코드 - 32 를 통해 대문자로 만들어주고, 홀수 번째라면 tolower() 또는 아스키 코드 + 32 를 통해 소문자로 만들어준다.

💻소스코드

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    int idx = 0;
    for (int i = 0; i < s.length(); i++){
        if (s[i] == ' '){
            answer += s[i];
            idx = 0;
            continue;
        }
        if (idx % 2 == 0)
            answer += toupper(s[i]);
        else
            answer += tolower(s[i]);
        idx++;    
    }
    return answer;
}

📝 문자열 내 마음대로 정렬하기

문제 설명

문자열 내 마음대로 정렬하기

해결 방법

문자의 오름차순 정렬과 문자열의 오름차순 정렬이 필요하므로 algorithm 헤더의 sort() 함수를 사용했다. 문제 조건에 의하면 각 string의 인덱스 n번째 글자를 비교하므로 사용자 정의 함수 compare를 따로 작성했다. 다만 인자 n을 compare 함수에 어떻게 받아오나 고민하다가 결국 전역변수를 사용하기로 했다. 오름차순 정렬을 원한다면 compare 함수에서 first argument와 second argument 비교 시 '<' 연산자를 사용해서 return 값이 true면 된다. 내림차순 정렬을 원한다면 '>' 연산자를 사용해서 return 값이 true면 된다. 인덱스 n번째 글자가 같다면 string 전체를 비교해서 사전순으로 오름차순 정렬하도록 작성했다.

💻소스코드

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

using namespace std;
int N;  // compare 함수에 n값을 받아오는 용도로 선언
bool compare(string a, string b)
{
    if (a[N] == b[N])
        return a < b;
    else if (a[N] < b[N])
        return true;
    else
        return false;
}

vector<string> solution(vector<string> strings, int n) {
    vector<string> answer = strings;
    N = n;
    sort(answer.begin(), answer.end(), compare);
    return answer;
}

profile
알고리즘

0개의 댓글