본문 바로가기
::public/코딩테스트 풀이

프로그래머스 문제 풀이

by 해맑은욱 2019. 8. 12.
*점프 슈트(while문) 
K칸을 앞으로 점프 > 건전지 사용. 
현재까지 온 거리 X 2 > 순간이동 건전지 사용 안함. 
이동 거리 N 까지 건전지 사용 최솟값 구하기. 
 
#include <iostream>
using namespace std
 
int solution(int n) 
    int ans = 0
 
    while(n > 0
    { 
        if(n % 2 == 0
            n = n / 2
        else 
        { 
            n -= 1
            ans++
        } 
    }     
 
    return ans; 
 
===================================================== 
 
*다음 큰 숫자 (while문) 
자연수 n, 다음 큰 숫자 구하기. 
2진수로 변환했을때 1의 갯수가 같은 수중에 최솟값. 
 
#include <iostream>
#include <vector>
 
using namespace std
 
int resultCount(int n) 
    vector v; 
    while(n > 0
    { 
        v.push_back(n % 2); 
        n /= 2
    } 
 
    int count = 0
    vector::iterator iter; 
    for(iter = v.begin(); iter != v.end(); ++iter) 
    { 
        if(*iter == 1
            count++
    } 
    return count; 
 
int solution(int n) { 
    int answer = 0
 
    int i = 0
    int k = 0
 
    i = resultCount(n); 
 
    while(true
    { 
        n++
        k = resultCount(n); 
 
        if(i == k) 
            break
    } 
 
    return n; 
 
다른 방식 
#include <iostream> 
 
using namespace std
 
int resultCount(int n) 
    int count = 0
    while(n > 0
    { 
        count += n % 2
        n /= 2
    } 
 
    return count; 
 
int solution(int n) { 
    int answer = 0
 
    int i = 0
    int k = 0
 
    i = resultCount(n); 
 
    while(true
    { 
        n++
        k = resultCount(n); 
 
        if(i == k) 
            break
    } 
 
    return n; 
 
===================================================== 
 
*문자열중에 같은 문자 확인(string
대소문자 구분 없음. 
'p''y' 의 개수가 같으면 true, 다르면 false 리턴. 
 
#include <iostream>
#include <string>
using namespace std
 
bool solution(string s) 
    bool answer = true
    int a = 0, b = 0
    for(int i = 0; i < s.length(); i++
    { 
        string str = s.substr(i, 1); 
        if(str == "p" || str == "P"
            a++
        else if(str == "y" || str == "Y"
            b++
    } 
 
    if(a == b) 
        answer = true
    else 
        answer = false
 
    return answer; 
 
===================================================== 
 
*약수 더하기.(for문) 
n의 약수를 모두 더한값 리턴. 
 
#include <iostream>
 
using namespace std
 
int solution(int n) { 
    int answer = 0
 
    for(int i = 1; i <= n; i++
    { 
        if(n % i == 0
            answer += i; 
    } 
 
    return answer; 
 
===================================================== 
 
*직사각형 별 찍기.(for문) 
가로 n 세로 m 의 직사각형 별 찍기. 
 
#include <iostream>
#include <string>
 
using namespace std
 
int main(void
    int n; 
    int m; 
    cin >> n >> m; 
     
    string s; 
    for(int i = 0; i < n; i++
    { 
        s += "*"
    } 
    for(int j = 0; j < m; j++
    { 
        cout<< s << "\n"
    } 
    return 0
 
===================================================== 
 
*완주하지 못한 선수(해시,정렬) 
참여 선수 배열 participant, 완주 선수 배열 completion. 
완주하지 못한 선수 이름 리턴. 
 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std
 
string solution(vector participant, vector completion) 
    string answer = ""
     
    sort(participant.begin(), participant.end()); 
    sort(completion.begin(), completion.end()); 
     
    for(int i = 0; i < participant.size(); i++
    { 
        if(participant[i] != completion[i]) 
        { 
            answer = participant[i]; 
            break
        }             
    } 
     
    return answer; 
 
===================================================== 
 
*전화번호 목록(해시,정렬) 
전화번호를 담은 배열 phone_book의 어떤 번호가  
다른 번호의 접두어인 경우가 있으면 false를 아니면 true를 리턴 
 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std
 
bool solution(vector phone_book)  
    bool answer = true
     
    sort(phone_book.begin(), phone_book.end()); 
     
    string temp = phone_book[0]; 
    for(int i = 1; i < phone_book.size(); i++
    { 
        if(phone_book[i].find(temp) != string::npos) 
        { 
            answer = false
            break
        }             
    } 
     
    return answer; 
 
===================================================== 
 
*위장(해시맵) 
clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. 
같은 이름을 가진 의상은 존재하지 않습니다. 
스파이는 하루에 최소 한 개의 의상은 입습니다. 
[["yellow_hat""headgear"], ["blue_sunglasses""eyewear"], ["green_turban""headgear"]] 
 
#include <iostream>
#include <algorithm>
#include <map>
 
using namespace std
 
int solution(vector<vector> clothes) { 
    int answer = 0
     
    map<stringint> tmap; 
     
    for(auto elem : clothes) 
    { 
        string key = elem.second; 
        if(tmap.end() != tmap.find(key)) 
        { 
            tmap[key]++
        } 
        else 
        { 
            tmap.insert(make_pair(key, 1)); 
        } 
    } 
     
    answer = 1
    for(auto elem : tmap) 
    { 
        int value = elem.second; 
        answer *= value + 1
    } 
    answer -= 1
     
    return answer; 
 
===================================================== 
 
*베스트앨범 
 
===================================================== 
 
*탑(스택) 
수평 직선에 탑 N대를 세웠습니다. 
발사한 신호는 신호를 보낸 탑보다 높은 탑에서만 수신합니다.  
또한, 한 번 수신된 신호는 다른 탑으로 송신되지 않습니다. 
 
#include <iostream>
#include <vector>
 
using namespace std
 
vector solution(vector heights) { 
    vector answer; 
     
    answer.push_back(0); 
    for(int i = 1; i < heights.size(); i++
    { 
        for(int j = i - 1; j >= 0; j--
        { 
            if(heights[j] > heights[i]) 
            { 
                answer.push_back(j + 1); 
                break
            } 
            else if(j == 0
            { 
                answer.push_back(0); 
            }                 
        } 
    } 
     
    return answer; 
 
===================================================== 
 
*소수의 합(기타) 
2부터 N까지의 모든 소수의 합을 구하기. 
 
#include <iostream>
 
using namespace std
 
long long solution(int N) { 
    long long answer = 0
     
    vector nums; 
    nums.assign(N + 11); // N + 1 만큼의 배열 개수를 1의 값으로 채운다. 
     
    for(int i = 2; i <= N; i++
    { 
        if(nums[i] != 0
        { 
            for(int j = i * 2; j <= N; j += i) 
                nums[j] = 0
        }         
    } 
     
    for(int i = 2; i <= N; i++
    { 
        if(nums[i] != 0
            answer += i; 
    } 
     
    return answer; 
 
===================================================== 
 
*k번째 수(정렬) 
 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std
 
vector solution(vector array, vector<vector> commands) { 
    vector answer; 
 
    for(auto elem : commands) 
    { 
        vector temp; 
        for(int i = elem[0- 1; i < elem[1]; i++
        { 
            temp.push_back(array[i]); 
        } 
        sort(temp.begin(), temp.end(), less()); 
        answer.push_back(temp[elem[2- 1]); 
    } 
 
    return answer; 
 
===================================================== 
 
*2016년 
a월 b일 요일 구하기. 
16년 1월 1일은 금요일. 윤년(2.29
 
#include <iostream>
 
using namespace std
 
string solution(int a, int b) { 
    string answer = ""
 
    vector day = {"THU","FRI","SAT","SUN","MON","TUE","WED"}; 
    vector month = {31,29,31,30,31,30,31,31,30,31,30,31}; 
 
    int count = 0
    for(int i = 0; i < a - 1; i++
    { 
        count += month[i]; 
    } 
    count += b;     
    answer = day[count % 7];  
 
    return answer; 
 
===================================================== 
 
*가운데 글자 가져오기(string
 
#include <iostream>
#include <string>
 
using namespace std
 
string solution(string s) { 
    string answer = ""
     
    int len = s.length(); 
    int center = (len + (len % 2)) / 2
    int pos = 2 - (len % 2); 
     
    answer = s.substr(center - 1, pos); 
     
    return answer; 
 
===================================================== 
 
*같은 숫자는 싫어 
배열에 연속적으로 나타나는 숫자 하나만 남기고 제거. 
 
#include <iostream>
#include <vector>
 
using namespace std
 
vector solution(vector arr)  
    vector answer; 
 
    int temp = arr[0]; 
    answer.push_back(temp); 
    for(int i : arr) 
    { 
        if(i != temp) 
        { 
            answer.push_back(i); 
            temp = i; 
        } 
    } 
 
    return answer; 
 
===================================================== 
 
*문자열 내맘대로 정렬하기(string
문자열 리스트 strings와 정수 n이 주어짐. 
문자열의 n번째 인덱스 비교. 오름차순 정렬. 
단 문자열 n번째가 같으면 전체 문자열 비교. 
 
#include <iostream>
#include <algorithm>
#include <string>
 
using namespace std
 
int pos; 
bool compareStr(string a, string b) 
    if(a[pos] == b[pos]) 
    { 
        return a < b; 
    } 
    return a[pos] < b[pos]; 
 
vector solution(vector strings, int n) { 
    vector answer; 
 
    pos = n; 
    sort(strings.begin(), strings.end(), compareStr); 
 
    return strings; 
 
===================================================== 
 
*문자열 다루기 기본 
 
#include <iostream>
#include <algorithm> 
 
using namespace std
 
bool solution(string s)  
{     
    for ( char c : s )  
        if ( isdigit(c) == false ) 
            return false
    } 
 
    if ( s.length() != 4 && s.length() != 6 ) 
        return false
 
===================================================== 
 
*소수 찾기 
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환 
 
#include <iostream>
#include <vector>
 
using namespace std
 
int solution(int n) { 
    int answer = 0
     
    vector nums = {0,0}; 
    for(int i = 2; i <= n; i++
    { 
        nums.push_back(1); 
    } 
     
    for(int i = 2; i <= n; i++
    { 
        if(nums[i] == 1
        { 
            for(int j = i * 2; j <= n; j += i) 
            { 
                nums[j] = 0
            } 
        } 
    } 
     
    for(int b : nums) 
    { 
        answer += b; 
    } 
     
    return answer; 
 
===================================================== 
 
*수박수박수? 
n의 값에 따른 "수박수박수.." 출력.  
 
#include <iostream>
#include <string>
 
using namespace std
 
string solution(int n) { 
    string answer = ""
     
    for(int i = 0; i < n; i++
    { 
        if(i % 2 == 0
            answer.append("수"); 
        else 
            answer.append("박"); 
    } 
     
    return answer; 
 
===================================================== 
 
*문자열을 정수로 바꾸기(음수도 stoi 됨;) 
 
#include <iostream>
#include <string>
 
using namespace std
 
int solution(string s) { 
    int answer = 0
     
    answer = stoi(s); 
     
    return answer; 
 
===================================================== 
 
*약수의 합 
 
#include <iostream>
 
using namespace std
 
int solution(int n) { 
    int answer = 0
     
/**case1*/ O(n) 
    for(int i = 1; i <= n; i++
    { 
        if(n % i == 0
            answer += i; 
    } 
     
/**case2*/ O(logn) 
    for(int i = 1; i * i <= n; i++
    { 
        if(n % i == 0
            answer = answer + i + n/i; 
        if(i * i == n) 
            answer = answer - i; 
    } 
     
    return answer; 
 
 
===================================================== 
 
* 시저암호(string
각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꿈. 
- A, z - a 로 바뀜. 공백은 공백. 
 
#include <iostream>
#include <string>
 
using namespace std
 
string solution(string s, int n) { 
    string answer = ""
     
    int pos; 
    for(int i = 0; i < s.size(); i++
    { 
        if(s[i] == ' '
            answer += ' '
        else 
        { 
            pos = (s[i] >= 'a') ? 'a' : 'A'
            answer += pos + (s[i] - pos + n) % 26
        } 
    } 
     
    return answer; 
 
 
===================================================== 
 
*예산(정렬) 
신청한 금액 배열, 예산이 있음. 
예산으로 물품 구매 가능한 부서 최대값. 
 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std
 
int solution(vector d, int budget) { 
    int answer = 0
     
    sort(d.begin(), d.end()); 
    for(int i : d) 
    { 
        budget -= i; 
        if(budget < 0
            break
        answer++
    } 
     
    return answer; 
 
===================================================== 
 
*이상한 문자 만들기 
공백을 기준으로 짝수는 대문자 홀수는 소문자 변환하기. 
0번째 인덱스는 짝수로 처리. 
 
#include <iostream>
#include <string>
 
using namespace std
 
string solution(string s) { 
    string answer = ""
 
    int count = 0
    for(int i = 0; i < s.size(); i++
    { 
        if(s[i] == ' '
        { 
            count = 0
        } 
        else 
        { 
            if(count % 2 == 0
                s[i] = toupper(s[i]); 
            else 
                s[i] = tolower(s[i]); 
 
            count++
        } 
    } 
 
    return s; 
 
===================================================== 
 
*프린터(스택/큐) 
중요도 대기목록, location 위치의 문서가 몇번째로 인쇄되는지. 
인쇄 대기목록의 젤 처음을 꺼냄. 
대기목록에서 중요도가 가장 높으면 인쇄. 아니면 젤뒤로 넣음. 
 
#include <iostream>
#include <deque>
#include <pair>
 
using namespace std
 
int solution(vector priorities, int location) { 
    int answer = 0
 
    deque<pair<intbool>> que; 
    for(int i = 0; i < priorities.size(); i++
    { 
        bool b = false
        if(i == location) 
            b = true
        que.push_back(make_pair(priorities[i], b)); 
    } 
 
    int count = 0
 
    while (!que.empty()) 
    { 
        int pivot = que[0].first; 
        bool b = que[0].second; 
        int i; 
        for (i = 0; i < que.size(); i++
        { 
            if (que[i].first > pivot) 
            { 
                que.push_back(que[0]); 
                que.pop_front(); 
                break
            } 
        } 
        if (i == que.size()) // 중요도 높은게 없다. 
        { 
            count++
            que.pop_front(); 
            if (b) 
                return count; 
        } 
    } 
 
===================================================== 
 
*가장 큰 수(정렬 & 문자열) 
주어진 배열의 값들로 최대값 만들기. 
 
#include <iostream>
#include <string>
#include <vector>
 
using namespace std
 
bool compareNum(int a, int b) 
    string s1 = to_string(a); 
    string s2 = to_string(b); 
 
    return s1 + s2 > s2 + s1; 
 
string solution(vector numbers) { 
    string answer = ""
 
    sort(numbers.begin(), numbers.end(), compareNum); 
    for(auto elem : numbers) 
    { 
        answer += to_string(elem); 
    } 
 
    if(answer[0== '0'
        answer = '0'
 
    return answer; 
 
===================================================== 
 
*H-Index(정렬) 
논문 n편 중, h번 이상 인용된 논문이 h편 이상 나머지 논문이 h번 이하 인용되었다면 h = H-Index. 
 
 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std
 
int solution(vector citations) { 
    int answer = 0
 
    sort(citations.begin(), citations.end(), greater()); 
 
    int p = 0;     
    while(true
    { 
        if(p >= citations[p]) 
            break
        p++
    } 
 
    return answer = p; 
 
===================================================== 
 
*체육복(탐욕법 Greedy) 
전체 학생의 수 n, 체육복을 도난당한 학생 lost[], 여분 학생 reserve[] 
reserve[] +1-1 번호 학생에게 빌려줄수 있음. 
수업을 들을 수 있는 학생의 최대값 
 
 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std
 
int solution(int n, vector lost, vector reserve) { 
    int answer = 0
     
    vector in; 
    in.assign(n + 21); 
     
    for(int i = 0; i < lost.size(); i++
    { 
        in[lost[i]]--
    } 
    for(int i = 0; i < reserve.size(); i++
    { 
        in[reserve[i]]++
    } 
    for(int i = 1; i <= n; i++
    { 
        if(in[i] == 1 || in[i] == 2
            answer++
        else 
        { 
            if(in[i - 1> 1
            { 
                in[i]++
                in[i - 1]--
                answer++
                continue
            } 
             
            if(in[i + 1> 1
            { 
                in[i]++
                in[i + 1]--
                answer++
                continue
            } 
        }             
    }    
     
    return answer; 
 
===================================================== 
 
*정수 제곱근 판별 
임의의 정수 n에 대해 어떤 정수 x의 제곱인지 아닌지 판단. 
n이 x의 제곱이면 x+1의 제곱 리턴. 아니면 -1 리턴. 
 
#include <iostream>
 
using namespace std
 
long long solution(long long n) { 
    long long answer = 0
 
    double d = sqrt(n); 
    int i = sqrt(n); 
 
    if(d - i == 0
        answer = pow(i + 12); 
    else 
        answer = -1
 
 
    return answer; 
 
===================================================== 
 
*제일 작은 수 제거하기. 
가장 작은 수를 제거. 빈 배열이면 -1을 채워 리턴. 
 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std
 
vector solution(vector arr) { 
    vector answer; 
     
    vector::iterator iter; 
    iter = min_element(arr.begin(), arr.end()); 
    arr.erase(iter); 
    if(arr.size() == 0
        arr.push_back(-1); 
    answer = arr; 
     
    return answer; 
 
===================================================== 
 
*평균 구하기. 
정수를 담고 있는 배열 arr의 평균값을 리턴. 
 
#include <iostream>
#include <string>
#include <vector>
 
using namespace std
 
double solution(vector arr) { 
    double answer = accumulate(arr.begin(), arr.end(), 0); 
 
    return answer / arr.size(); 
 
===================================================== 
 
*스킬트리 
선행 스킬 순서를 지켜야 하고 배운 순서가 뒤바뀌면 사용 불가능. 
이전 스킬을 배워야 이후 스킬을 배움. 안배우면 사용 불가능. 
 
 
#include <iostream>
#include <string>
#include <vector>
 
using namespace std
 
int solution(string skill, vector skill_trees) { 
    int answer = 0
     
    vector learned; 
    for (int i = 0; i < skill_trees.size(); i++
    { 
        string tree = skill_trees[i]; 
        string s; 
        for (int j = 0; j < tree.size(); j++
        { 
            for (int k = 0; k < skill.size(); k++
            { 
                if (tree[j] == skill[k]) 
                { 
                    s += tree[j]; 
                } 
            } 
        } 
        learned.push_back(s); 
    } 
     
    for(int i = 0; i < learned.size(); i++
    { 
        string s = learned[i]; 
        bool flag = false
        for(int j = 0; j < s.size(); j++
        { 
            if(s[j] == skill[j]) 
                flag = true
            else 
            { 
                flag = false
                break
            }                 
        } 
        if(flag == true || s.size() == 0
            answer++
    } 
     
    return answer; 
 
 
cs
 
 

'::public > 코딩테스트 풀이' 카테고리의 다른 글

직사각형 별 찍기  (0) 2019.09.05
약수 더하기  (0) 2019.09.05
문자열 중에 같은 문자 확인  (0) 2019.09.05
다음 큰 숫자  (0) 2019.09.05
점프 슈트  (0) 2019.09.05