오산마 study day 4

DaewoongJeon·2021년 3월 4일

OSanMa Algorithm Study

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

1. 목표

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

B. Hash table

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

  • 푼 문제 list
  1. 문자열을 정수로 바꾸기 https://programmers.co.kr/learn/courses/30/lessons/12925
  2. 내적 https://programmers.co.kr/learn/courses/30/lessons/70128
  3. 이상한 문자 만들기 https://programmers.co.kr/learn/courses/30/lessons/12930
  4. 자연수 뒤집어 배열로 만들기 https://programmers.co.kr/learn/courses/30/lessons/12932
  5. 정수 제곱근 판별 https://programmers.co.kr/learn/courses/30/lessons/12934
  6. 짝수와 홀수 https://programmers.co.kr/learn/courses/30/lessons/12937
  7. 최대공약수와 최소공배수 https://programmers.co.kr/learn/courses/30/lessons/12940
  8. 평균 구하기 https://programmers.co.kr/learn/courses/30/lessons/12944
  9. 핸드폰 번호 가리기 https://programmers.co.kr/learn/courses/30/lessons/12948
  10. x만큼 간격이 있는 n개의 숫자 https://programmers.co.kr/learn/courses/30/lessons/12954

A. 문자열을 정수로 바꾸기

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    answer = stoi(s);
    return answer;
}
  • 코드 설명
  1. string 클래스 내부의 stoi 함수를 활용하여 입력받은 s string 값을 int 형으로 변환하여 반환한다.
  • 부가 설명
  1. stoi 함수는 입력으로 string 변수를 받는데, string 값의 일부만 인덱스를 활용하여 입력하는 건 불가능해보인다. string 값의 일부만 stoi 함수를 활용하여 int 형으로 변환할 방안을 찾아봐야 할 듯.

B. 내적

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> a, vector<int> b) {
    int answer = 0;
    for (int i = 0; i < a.size(); i++)
        answer += a[i] * b[i];
    return answer;
}
  • 코드 설명
  1. 같은 index에 해당하는 값을 곱하여 곱한 값들을 모두 더한 뒤 반환해야 한다.
  2. for loop를 활용하여 같은 index의 값끼리 곱하게 하였고, 곱한 값을 answer 변수에 계속 더하도록 하였다.

C. 이상한 문자 만들기

#include <string>
#include <vector>

using namespace std;

string solution(string s) {
    string answer = "";
    int char_tmp = 0;
    for (int i = 0; i < s.size(); i++)
    {
        if (isalpha(s[i]))
        {
            if (char_tmp % 2 == 0)
            {
                if (!(isupper(s[i])))
                    s[i] -= 32;
            }
            else
            {
                if (isupper(s[i]))
                    s[i] += 32;
            }
            char_tmp++;
        }
        else
            char_tmp = 0;
    }
    answer = s;
    return answer;
}
  • 코드 설명
  1. 공백을 제외하고 문자에서의 index만 계산하여 짝수 홀수를 구분해야하므로 char_tmp 변수를 두고 공백을 만났을 때 0으로 초기화 하도록 함
  2. string 값이 문자일 경우, 짝홀을 구분하여 아스키 계산을 통해 소문자 또는 대문자로 변환하도록 함.

D. 자연수 뒤집어 배열로 만들기

#include <string>
#include <vector>

using namespace std;

vector<int> solution(long long n) {
    vector<int> answer;
    int tmp = 1;
    for (int i = 0; n != 0; i++)
    {
        answer.push_back(n % 10);
        n /= 10;
    }
    return answer;
}
  • 코드 설명
  1. 입력된 n에서 10으로 나눈 나머지를 answer vector 변수에 차곡차곡 넣도록 함.

E. 정수 제곱근 판별

#include <string>
#include <vector>

using namespace std;

long long solution(long long n) {
    long long answer = 0;
    for (long long i = 0 ; i * i <= n; i++)
    {
        if (i * i == n)
        {
            answer = (i + 1) * (i + 1);
            break;
        }
    }

    if (answer == 0)
        answer = -1;
    return answer;
}
  • 코드 설명
  1. i의 제곱이 n이 될 때까지 for loop를 돌렸고, for loop 내부에서 n의 제곱근인 i를 조건문을 통해 발견했을 경우, i + 1를 제곱하여 answer에 입력하도록 한다.
  2. for loop가 끝난 후 answer가 0이란 의미는 for loop 내부에서 n에 대한 제곱근을 못찾았다는 것이고 answer에 -1을 입력하여 return하도록 한다.
  • 부가 설명
  1. 일부 case에서 오류가 발생하였는데, long long 형인 n과 비교하는 i를 int 형으로 선언하여 오류가 발생했다.

F. 짝수와 홀수

#include <string>
#include <vector>

using namespace std;

string solution(int num) {
    string answer = "";
    if (num % 2 == 0)
        answer += "Even";
    else
        answer += "Odd";
    return answer;
}
  • 코드 설명
  1. 입력받은 num을 2로 나눈 나머지가 0이면 짝수라는 것을 이용해서 조건문을 구성한다.

G. 최대공약수와 최소공배수

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, int m) {
    vector<int> answer;
    int result = 1;
    int tmp = (n > m) ? m : n;
    for (int i = 1; i <= tmp; i++)
    {
        if (n % i == 0 && m % i == 0)
            result = i;
    }
    answer.push_back(result);
    result = (n * m) / result;
    answer.push_back(result);
    return answer;
}
  • 코드 설명
  1. 삼항연산자를 통해 입력받은 n과 m의 대소관계를 판단하여 작은 수를 tmp에 입력한다.
  2. for loop를 tmp번 동작하게 하고 for loop 내부에서 n과 m이 둘다 나누어 떨어지는 i 값을 구하여 result에 입력한다.
  3. 입력된 result는 answer vector에 차곡차곡 넣는다.
  4. result 값을 n과 m을 곱한 값에 기존의 result 값을 나눈 결과값으로 갱신한다.
  5. 갱신된 result 값을 answer vector에 넣는다.

H. 평균 구하기

#include <string>
#include <vector>

using namespace std;

double solution(vector<int> arr) {
    double answer = 0;
    int i;
    for (i = 0; i < arr.size(); i++)
        answer += arr[i];
    answer /= i;
    return answer;
}
  • 코드 설명
  1. for loop를 통해 배열에 있는 값을 모두 더했고, for loop 동작 횟수 i로 나누어 평균을 구하였다.

I. 핸드폰 번호 가리기

#include <string>
#include <vector>

using namespace std;

string solution(string phone_number) {
    string answer = "";
    for (int i = 0; i < phone_number.size(); i++)
    {
        if (i > (int)phone_number.size() - 5)
            answer += phone_number[i];
        else if (i <= (int)phone_number.size() - 5)
            answer += '*';
    }
    return answer;
}
  • 코드 설명
  1. for loop 내부에서 증가하는 i 값이 입력받은 string 값의 크기에 5를 뺀 값보다 클 경우에만 phone_number를 answer string 변수에 더하도록 하여 phone_number 뒷 4자리만 표현되도록 하였다.
  2. 그 외의 경우는 answer에 *을 더해주었다.
  • 부가 설명
  1. 일부 케이스에서 오류가 발생하였는데 string 변수에 size 함수를 활용하여 변수의 크기를 return 하였을 때, return된 값은 size_t 형이다. size_t형에 int형인 i를 비교하여 오류가 발생한 것이었고 반환된 size_t형을 (int)를 활용하여 int형으로 바꾸었다.

J. x만큼 간격이 있는 n개의 숫자

#include <string>
#include <vector>

using namespace std;

vector<long long> solution(int x, int n) {
    vector<long long> answer;
    int tmp = x;
    for (int i = 0; i < n; i++)
    {
        answer.push_back(x);
        x += tmp;
    }
    return answer;
}
  • 코드 설명
  1. for loop를 n번 돌려 n개의 숫자를 맞춰준다.
  2. for loop를 통해 x로 초기화된 tmp를 x에 계속 더해주고 answer vector에 차곡차곡 쌓아준다.

3. Hash table

0개의 댓글