[알고리즘]프로그래머스 0602

정제철·2023년 6월 1일
0

알고리즘

목록 보기
10/12
post-thumbnail

📢1. 이상한 문자 만들기

  • 문제 설명
    문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

  • 제한 사항
    문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
    첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

  • 입출력 예
    s return
    "try hello world" "TrY HeLlO WoRlD"

✍내풀이

#include <string>

using namespace std;

string solution(string s) {
    string answer = "";
    int cnt = 0;
    for(auto i : s)
    {
        if(isalpha(i))
        {
            if(cnt%2==0) answer+=toupper(i);
            else answer+=tolower(i);
            cnt++;            
        }
        else {
            answer+=i;
            cnt=0;
        }
    }
    return answer;
}
  • "try hello world" -> "TrY HeLlO WoRlD" 일때
    문자의 짝수 인덱스에 대문자가 와야하는 것을 알았지만,
    문자의 홀수 인덱스는 소문자가 와야한다는 것을 몰랐다.
    테스트 케이스에선 모두 소문자이지만 대소문자가 섞여있을 수 있기 때문이다.

📍isalpha(), toupper(), tolower()

  • isalpha() 함수는 문자가 알파벳인지 확인하고, -> if(isalpha(i))
  • toupper() 함수는 문자를 대문자로 변환하며, -> toupper(i)
  • tolower() 함수는 문자를 소문자로 변환한다. -> tolower(i)

📝다른풀이

string solution(string s) {
    string answer = "";
    int nIndex = 1;
    for (int i = 0; i < s.size(); i++, nIndex++)
    {
        if (s[i] == ' ')
        {
            nIndex = 0;
            answer += " ";
        }
        else
            nIndex & 1 ? answer += toupper(s[i]) : answer += tolower(s[i]);
    }
    return answer;
}
  • for (int i = 0; i < s.size(); i++, nIndex++)을 통해 index숫자를 자동으로 올린다.
  • nIndex & 1 ? answer += toupper(s[i]) : answer += tolower(s[i]); 삼항연산자를 통해 코드를 간결하게 구현한다.

📢2. 크기가 작은 부분문자열

  • 문제 설명
    숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

  • 제한사항
    1 ≤ p의 길이 ≤ 18
    p의 길이 ≤ t의 길이 ≤ 10,000
    t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.
  • 입출력 예
    t p result
    "3141592" "271" 2
    "500220839878" "7" 8
    "10203" "15" 3

✍내풀이

#include <string>
#include <vector>

using namespace std;

int solution(string t, string p) {
    int answer = 0;
    vector<string> v;
    for (int i = 0; i < t.size()-p.size()+1; i++)
    {
        v.push_back(t.substr(i, p.size()));
    }
    for (auto i : v)
    {
        int x = stoll(i);
        if(i<=p) answer++;
    }

    return answer;
}

📍substr(), stoll()

string **substr** (size_t pos, size_t len)
  • pos: 추출을 시작할 위치를 나타내는 인덱스입니다.
  • len: 추출할 문자열의 길이를 나타냅니다.
  • stoll() : 문자열(string)을 long long 형식으로 변환하는 역할을 합니다.

📝다른풀이

int solution(string t, string p) {
    int answer = 0;
    for (int i = 0; i <= t.size() - p.size(); i++){
        if (stol(p) >= stol(t.substr(i, p.size()))){
        answer++;
        }
    }
    return answer;
}

📢3. 핸드폰 번호 가리기

  • 문제 설명
    프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
    전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

  • 제한 조건
    phone_number는 길이 4 이상, 20이하인 문자열입니다.

  • 입출력 예
    phone_number return
    "01033334444" "*******4444"
    "027778888" "*****8888"

✍내풀이

#include <string>

using namespace std;

string solution(string phone_number) {
    for(int i = 0; i<phone_number.size()-4;i++)
    {
        phone_number[i]='*';
    }
    return phone_number;
}

📝다른풀이

#include <string>

using namespace std;

string solution(string phone_number) {
    string answer = phone_number;
    for (int i = 0; i < answer.size() - 4; i++) {
        answer.replace(i, 1, "*");
    }
    return answer;
}

📍replace()

  • replace(size_t pos, size_t count, const string& str)
- pos: 대체를 시작할 위치를 나타내는 인덱스입니다.
- count: 대체할 문자의 수를 나타냅니다.
- str: 대체할 문자열로, 이 문자열이 대상 문자열에 삽입됩니다.

using ULL = unsigned long long;
ULL num = 
profile
성공의 반대는 실패가 아닌 도전하지 않는 것이다.

0개의 댓글