오산마 study day 3

DaewoongJeon·2021년 3월 4일

OSanMa Algorithm Study

목록 보기
3/10
  • 날짜 : 2021. 3. 3. (수)

1. 목표

A. 프로그래머스 코테 문제 1단계 10문제 풀기

2. 프로그래머스 코테 문제 1단계 10문제

  • 푼 문제 list
  1. 수박수박수박수박수박수? https://programmers.co.kr/learn/courses/30/lessons/12922
  2. 시저 암호 https://programmers.co.kr/learn/courses/30/lessons/12926
  3. 약수의 합 https://programmers.co.kr/learn/courses/30/lessons/12928
  4. 자릿수 더하기 https://programmers.co.kr/learn/courses/30/lessons/12931
  5. 정수 내림차순으로 배치하기 https://programmers.co.kr/learn/courses/30/lessons/12933
  6. 제일 작은 수 제거하기 https://programmers.co.kr/learn/courses/30/lessons/12935
  7. 키패드 누르기 https://programmers.co.kr/learn/courses/30/lessons/67256
  8. 콜라츠 추측 https://programmers.co.kr/learn/courses/30/lessons/12943
  9. 하샤드 수 https://programmers.co.kr/learn/courses/30/lessons/12947
  10. 행렬의 덧셈 https://programmers.co.kr/learn/courses/30/lessons/12950

A. 수박수박수박수박수박수?

#include <string>
#include <vector>

using namespace std;

string solution(int n) {
    string answer = "";
    for (int i = 0; i < n; i++)
    {
        if (i % 2 == 0)
            answer += "수";
        else
            answer += "박";
    }
    return answer;
}
  • 코드 설명
  1. 패턴을 파악한 결과, 짝수 인덱스에는 '수'가 들어가고 홀수 인덱스에는 '박'이 들어간다.
  2. for loop를 통해 짝수 인덱스일 때에는 answer string 변수에 "수"를 더해줬고, 홀수 인덱스일 때에는 "박"을 더해줬다.

B. 시저 암호

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";
    for (int i = 0; i < s.size(); i++)
    {
        if (isalpha(s[i]))
        {
            if (!(isupper(s[i])))
            {
                if (s[i] + n > 'z')
                    answer += (s[i] - (26 - n));
                else
                    answer += (s[i] + n);
            }
            else
            {
                if (s[i] + n > 'Z')
                    answer += (s[i] - (26 - n));
                else
                    answer += (s[i] + n);
            }
        }
        else
            answer += s[i];
    }
    return answer;
}
  • 코드 설명
  1. for loop를 통해 s 값이 알파벳인지 확인한다.
  2. 알파벳일 경우, 대소문자를 구분하여 n만큼 더한 값이 'z'보다 큰지, 'Z'보다 큰지 확인한다.
  3. 클 경우, 초과한만큼 'a' 또는 'A'로 돌아가서 다시 더해준다.
  4. 알파벳이 아닐 경우, 그대로 answer string 변수에 더해준다.
  • 부가 설명
  1. string 값에 n만큼 더한 값이 alpha인지 확인할 때, 소문자 일 수도 있어서 예상치 못한 오류가 발생할 수 있음.

C. 약수의 합

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    int i;
    for (i = 1; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            if (!(i * i == n))
                answer += (n / i);
            answer += i;
        }
    }
    return answer;
}
  • 코드 설명
  1. 0부터 인자로 받은 n의 제곱근까지 for loop를 돌린다.
  2. for loop에서 증가하는 i 값을 n에 지속적으로 나누어 주고 나누어 떨어질 경우, answer에 int로 더해준다.

D. 자릿수 더하기

#include <iostream>

using namespace std;
int solution(int n)
{
    int answer = n % 10;
    int tmp = 10;
    while (0 != n / tmp)
    {
        answer += (n / tmp) % 10;
        tmp *= 10;
    }
    return answer;
}
  • 코드 설명
  1. answer를 n을 10으로 나눈 나머지 값으로 초기화해준다.
  2. while 문을 통해 자리마다 값을 뽑아준다.
  3. 뽑은 값을 answer에 계속 더해준다.

E. 정수 내림차순으로 배치하기

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

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    vector<int> tmp;
    int int_tmp2;
    int int_tmp = 1;
    while (n != 0)
    {
        tmp.push_back(n % 10);
        n /= 10;
    }
    sort(tmp.begin(), tmp.end(), greater<int>()); // less는 오름차순
    for (int i = tmp.size() - 1; i >= 0; i--)
    {
        answer += tmp[i] * int_tmp;
        int_tmp *= 10;
    }
    return answer;
}
  • 코드 설명
  1. while문을 통해 n으로 입력받은 int형을 각 자리수마다 나누어 tmp vector 변수에 넣어준다.
  2. tmp vector 함수를 sort함수를 활용하여 정렬한다.(매개변수로 넣는 값에 따라서 정렬방식이 결정됨, 아무것도 입력되지 않을 경우, 오름차순 정렬)
  3. 정렬된 tmp vector를 for loop를 통해 다시 int 값으로 변환한다.(라이브러리 함수가 있을듯)
  • 부가 설명
  1. sort(tmp.begin(), tmp.end(), greater<int>()) : 정렬이 필요한 인덱스에 해당하는 시작 주소와 끝 주소를 매개변수로 입력한다.
  2. less : 첫번째 인자가 두번째 인자보다 작으면 true 반환, greater : 첫번째 인자가 두번째 인자보다 크면 true 반환
  3. sort 함수에서 less, greater 함수가 매개변수로 입력될 수 있는데, 추측컨데 sort 함수 내부에서 매개변수로 받은 함수의 반환 값에 따라 정렬이 결정될 것으로 추측

F. 제일 작은 수 제거하기

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

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> answer;
    int index_tmp;
    int min;
    if (arr[0] < arr[1])
    {
        min = arr[0];
        index_tmp = 0;
    }
    else
    {
        min = arr[1];
        index_tmp = 1;
    }
    for (int i = 2; i < arr.size(); i++)
    {
        if (min > arr[i])
        {
            min = arr[i];
            index_tmp = i;
        }
    }
    arr.erase(arr.begin() + index_tmp);
    if (arr.size() == 0)
        answer.push_back(-1);
    else
        answer = arr;
    return answer;
}
  • 코드 설명
  1. arr의 0과 1 인덱스 값을 비교하여 작은 값으로 min을 초기화시킨다.
  2. for loop를 통해 arr 값과 min을 비교하여 min을 작은 값으로 갱신한다. 그리고 해당하는 index를 index_tmp에 넣어준다.
  3. arr 값이 없을 때에는 -1을 리턴시켜주고, erase vector 함수를 활용하여 index_tmp에 있는 값을 삭제한다.
  • 부가 설명
  1. arr.erase(arr.begin() + index_tmp) : arr의 시작점 주소에 index_tmp만큼 더한 주소 값에 해당하는 값을 삭제하고 메모리를 재할당한 후 남은 값을 다시 채워넣는다.

G. 키패드 누르기

H. 콜라츠 추측

#include <string>
#include <vector>

using namespace std;

int solution(int num) {
    int answer = 0;
    int tmp = num;
    int i;
    if (num == 1)
        return (0);
    for (i = 1; i <= 500; i++)
    {
        if (tmp % 2 == 0)
            tmp = tmp / 2;
        else if (tmp % 2 == 1) // 그냥 else로 하면 오류 발생
            tmp = (3 * tmp) + 1;
        if (tmp == 1)
            break;
    }
    answer = i;
    if (answer > 500)
        answer = -1;
    return answer;
}
  • 코드 설명
  1. 인자로 받은 num 값이 1일때는 0을 리턴한다.
  2. for loop를 돌려서 콜라츠 추측대로 홀수 짝수 구분하여 계산하고 1이 될 때 break 하여 for loop를 빠져나온다.
  3. for loop가 500번 이상 돌아갈 경우, for loop를 종료한다.
  4. for loop가 종료된 후에 answer가 500을 초과할 경우, -1을 리턴하고 아닐 경우, for loop가 돌아간 횟수를 리턴한다.
  • 부가 설명
  1. 짝수일 경우에 else를 추가하여 조건문을 구성하였으나 오류가 발생함. else if 로 홀수일경우를 따로 빼주었더니 오류가 없어짐. 오류발생이유는 아직 파악이 안되었음.

I. 하샤드 수

#include <string>
#include <vector>

using namespace std;

bool solution(int x) {
    bool answer = true;
    int i;
    int tmp = 1;
    int result = 0;
    for (i = 0; x / tmp != 0; i++)
    {
        result += (x / tmp) % 10;
        tmp *= 10;
    }
    if (x % result != 0)
        answer = false;
    return answer;
}
  • 코드 설명
  1. answer를 true로 초기화한다.
  2. for loop를 통해 x의 각 자리수 합을 result 변수에 넣는다.
  3. x에 result를 나눈 나머지가 0이 아닐 때 answer에 false를 입력한다.

J. 행렬의 덧셈

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    vector<vector<int>> answer;
    vector<int> tmp;
    for (int i = 0; i < arr1.size(); i++)
    {
        for (int j = 0; j < arr1[i].size(); j++)
            tmp.push_back(arr1[i][j] + arr2[i][j]);
        answer.push_back(tmp);
        tmp.clear();
    }
    return answer;
}
  • 코드 설명
  1. tmp vector를 매개변수로 선언해서 같은 인덱스의 arr1과 arr2를 더한 값을 tmp에 넣어준다.
  2. tmp vector에 값을 넣을 때마다 answer 2차원 vector 변수에 차곡차곡 넣어준다.

0개의 댓글