아래 모든 문제들은 프로그래머스에서 제공 되는 문제를 이용하였습니다, 감사합니다.

  • 모두 풀었음.

1. JadenCase 문자열 만들기

문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건

  • s는 길이 1 이상인 문자열입니다.
  • s는 알파벳과 공백문자(" ")로 이루어져 있습니다.
  • 첫 문자가 영문이 아닐때에는 이어지는 영문은 소문자로 씁니다. ( 첫번째 입출력 예 참고 )

입출력 예

풀이

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    for(int i = 0; i < s.size(); i++)
    {
        if('A' <= s[i] && s[i] <= 'Z')
            s[i] = tolower(s[i]);
        if(i > 0 && s[i - 1] == ' ')
            if('a' <= s[i] && s[i] <= 'z')
                s[i] = toupper(s[i]);
        if(i == 0 && isalpha(s[i]))
            s[i] = toupper(s[i]);
    }
    return answer = s;
}

설명

  • 맨 앞글자가 소문자일떄만 바꾸게 했고, 나머지는 소문자로 바꾸게 로직을 구상하였다.

2. N개의 최소공배수

문제 설명

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.

제한 사항

  • arr은 길이 1이상, 15이하인 배열입니다.
  • arr의 원소는 100 이하인 자연수입니다.

입출력 예

풀이

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int compare(const int *a, const int *b)
{
    return *a > *b ? -1 : 1;
}

// arr_len은 배열 arr의 길이입니다.
int solution(int arr[], size_t arr_len) {
    int answer = 0;
    qsort(arr, arr_len, sizeof(int), compare);
    int gop = arr[0];
    int max = 1;
    int tmp = 0;
    int b;
    for(int i = 0; i < arr_len - 1; i++)
    {
        b = arr[i + 1];
        if(gop < arr[i+1])
        {
            tmp = gop;
            gop = arr[i+1];
            arr[i+1] = tmp;
        }
        max = gop;
        while(arr[i+1] != 0)
        {        
            tmp = max % arr[i + 1];
            max = arr[i + 1];
            arr[i + 1] = tmp;
        }
        gop = gop * b / max;
    }
   answer = gop;
    return answer;
}

설명

  • 이문제는, 최소공배수와 최대공약수 구하는 방법을 선행 공부하고 접근하는게 쉽게 문제를 접근할수 있다.
  • 최소 공배수 구하는 공식이, gop = gop * b / max; 인데, 이건 딱히 푼다기 보단 그떄그때 찾아서 이용하는게 좋을거 같다.

3. 짝지어 제거하기

문제 설명

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항

  • 문자열의 길이 : 1,000,000이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

입출력 예

풀이

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

int solution(string s)
{
    int answer = 0;
    vector<char> stack;
    for(int i = 0; i < s.size(); i++)
    {
        if(stack.size() == 0)
            stack.push_back(s[i]);
        else
        {
            if(stack[stack.size() - 1] == s[i])
            {
                stack.pop_back();
            }
            else
                stack.push_back(s[i]);
        }
    }
    if(stack.size() == 0)
        return 1;
    return 0;
}

설명

  • 이 문제는 스택 자료형을 이용하면 쉽게 풀릴거 같다고 생각했다. (순차적으로 하나씩 넣으면서 검사하는게 쉬운 문제인거 같았음)

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN