반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

핵심 문제와 예는 위와 같다. 자연수 n을 넣었을 때, 124나라의 숫자로 변환해주면 되는 문제이다.

1 | 1, 2, 4만을 사용하는 나라? -> 3진법으로 처리
2 | 근데 3진법인데도 0, 1, 2가 아니라, 1, 2, 4이므로 10진수 0부터 10까지 변환해가면서 규칙을 찾아야함.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <vector>
 
using namespace std;
 
string solution(int n) {
    string answer = "";
    string base[3= { "4""1""2" }; // 계산해보면 3진수로 0은 4에 매칭, 1과 2는 그대로.
    
    while(n != 0)
    {
        answer = base[(n%3)] + answer; // 나머지 연산을 통해, 일의 자리부터 구해나감.
        if(n%3 == 0// 만약에 3의 배수를 나누면
            n = (n-1)/3// 몫을 구할 때 하나를 빼야 한다.
        else
            n = n/3
    }
    return answer;
}
cs

base 라는 배열 대신에, answer = "412"[a] + answer; 이런 식으로 풀이한 경우도 있다. "412"[n]은 굉장히 신박했다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

프로그래머스, 완전탐색, 소수찾기(C++)  (0) 2021.02.22
카카오 2021 문제 - 신규 아이디 추천(C++)  (0) 2021.02.21
다음 큰 숫자  (0) 2021.02.18
문자열 검색  (0) 2021.02.18
두 수 사이 합  (0) 2021.02.18
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

  • 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
  • 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
  • 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.

예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

제한 사항

  • n은 1,000,000 이하의 자연수 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <string>
#include <vector>
#include <iostream>
 
using namespace std;
 
int solution(int n) {
    int answer = 0, target = 0, cnt1 = 0, cnt2 = 0;
    
    for(int i=n, cnt1=0; i<=1000000; i++)
    {
        target = i; // 이진 변환을 위한 갱신 때문에 target을 둠.
        cnt2 = 0// n+1 부터의 1의 개수
        
        while(target != 0)
        {
            if(target%2 == 1// 이진 변환하면서 1이 나오면 바로 카운팅
                if(i != n)
                    cnt2++;
                else // n일 때만.
                    cnt1++// 이 카운트와 계속 비교함.
            target /= 2;
        }
 
        if(i > n && cnt1 == cnt2) // n보다 크고 1의 개수가 동일한 
        {
            answer = i;
            break;
        }
    }
    return answer;
}
cs
728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

카카오 2021 문제 - 신규 아이디 추천(C++)  (0) 2021.02.21
124 나라의 숫자  (0) 2021.02.20
문자열 검색  (0) 2021.02.18
두 수 사이 합  (0) 2021.02.18
카카오톡 비밀지도  (0) 2021.02.18
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

String형 배열 seoul의 element중 Kim의 위치 x를 찾아, 김서방은 x에 있다는 String을 반환하는 함수, solution을 완성하세요. seoul에 Kim은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • Kim은 반드시 seoul 안에 포함되어 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string>
#include <vector>
 
using namespace std;
 
string solution(vector<string> seoul) {
    string answer = "";
    
    for(int i=0; i<seoul.size(); i++)
        if(seoul[i] == "Kim")
        {
            answer += "김서방은 "
            answer += std::to_string(i) ;
            answer += "에 있다"
            break;
        }
    return answer;
}
cs

9번 라인의 .size() 와 13번 라인의 std::to_string(i) 사용을 주목하면 되겠다.

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

124 나라의 숫자  (0) 2021.02.20
다음 큰 숫자  (0) 2021.02.18
두 수 사이 합  (0) 2021.02.18
카카오톡 비밀지도  (0) 2021.02.18
SQL1  (0) 2021.02.15
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

a와 b를 포함한 사이 합

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string>
#include <vector>
 
using namespace std;
 
long long solution(int a, int b) {
    long long answer = 0;
    
    if(a>b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    } 
    for(int i=a; i<=b; i++)
        answer += i;
    return answer;
}
cs
728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

다음 큰 숫자  (0) 2021.02.18
문자열 검색  (0) 2021.02.18
카카오톡 비밀지도  (0) 2021.02.18
SQL1  (0) 2021.02.15
무식하게 완전 탐색! - 모의고사  (0) 2021.02.15
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <string>
#include <vector>
 
using namespace std;
 
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
 
    string tile;
    int or_res;
    
    for(int i=0; i<n; i++)
    {
        tile.clear();
        or_res = arr1[i] | arr2[i]; // 두 지도를 비교하여 or 비트 연산으로 벽인지 공백인지 확인
        
        for(int j=0; j<n; j++)
        {
            if(or_res == 0)
            {
                tile = ' ' + tile;
                continue;
            }
            
            if(or_res%2 == 1// 벽이면 
                tile = '#' + tile; // 벽 + 기존 타일 -> 이진수의 하단부터 계산되므로 뒤에서 앞으로 채워가야함.
            else
                tile = ' ' + tile; // 공백 + 기존 타일 -> 이진수의 하단부터 계산되므로 뒤에서 앞으로 채워가야함.
            
            or_res /= 2// 갱신
        }
        answer.push_back(tile);
    }
    return answer;
}
cs
728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

문자열 검색  (0) 2021.02.18
두 수 사이 합  (0) 2021.02.18
SQL1  (0) 2021.02.15
무식하게 완전 탐색! - 모의고사  (0) 2021.02.15
벡터 복사 및 sort 이용  (0) 2021.02.13
728x90
반응형
1
2
3
4
5
6
7
8
SELECT 
    ANIMAL_ID, NAME 
FROM 
    ANIMAL_INS 
WHERE 
    (INTAKE_CONDITION NOT LIKE 'Aged'
ORDER BY 
    ANIMAL_ID ASC;
cs

---------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
SELECT 
    ANIMAL_ID, NAME 
FROM
    ANIMAL_INS 
ORDER BY
    ANIMAL_ID ASC;
cs

------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
SELECT
    ANIMAL_ID, NAME, DATETIME
FROM
    ANIMAL_INS
ORDER BY 
    NAME ASC, DATETIME DESC;
    
cs

다중 정렬의 경우 NAME 기준으로 정렬되고, 그 기준을 유지한채로 DATETIME에 대해서 내림차순으로 정렬한다.

---------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
    NAME
FROM 
    ANIMAL_INS
ORDER BY
    DATETIME ASC
LIMIT 
    1;
 
SELECT 
    NAME
FROM 
    (SELECT * FROM ANIMAL_INS ORDER BY DATETIME ASC)
WHERE 
    rownum = 1;
cs

위는 MYSQL의 LIMIT을 이용, 아래는 ORACLE의 rownum을 이용

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

두 수 사이 합  (0) 2021.02.18
카카오톡 비밀지도  (0) 2021.02.18
무식하게 완전 탐색! - 모의고사  (0) 2021.02.15
벡터 복사 및 sort 이용  (0) 2021.02.13
우선순위 큐 이용한 문제 ㅋㅋ  (0) 2021.02.13
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 : https://programmers.co.kr/learn/courses/30/42840

나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <string>
#include <vector>
 
using namespace std;
 
vector<int> solution(vector<int> answers) {
    
    // 벡터를 이렇게 초기화할 수 있다~ 라고 알면 된다.
    vector<int> a_answer({ 12345 });
    vector<int> b_answer({ 21232425 });
    vector<int> c_answer({ 3311224455 });
    
    vector<vector<int>> students; // 세 사람의 제출 답안을 묶음.
    vector<int> answer; 
    // 문제 정답으로 가장 최대로 맞춘 사람의 인덱스가 들어감.
    // 맞춘 횟수가 동일하면 공동 순위로 함께 들어감 -> 2, 2, 2 / 0, 0, 0, -> 답 : 1,2,3 / 1,2,3
    
    int ac_idx = 0, ac[3= { 0, }; // 정답 맞춘 갯수, 카운트 (0:a/2:c)
    
    students.push_back(a_answer);
    students.push_back(b_answer);
    students.push_back(c_answer);
    
    
    for(auto it : students)
    {
        for(int i=0; i<answers.size(); i++// 문제 문항수 만큼 반복하면서
        {
            // 하나하나 맞는지 대입한다. 반복되는 패턴이므로 나머지 연산자 활용
            if(answers[i] == it[i%it.size()]) 
                ac[ac_idx]++;
        }
        if(answer.size() == 0// 첫 대입은 무조건 대입.
            answer.push_back(ac_idx+1);
        else if(ac[answer.back()-1< ac[ac_idx]) // 이전 대입의 카운트보다 크면 
        { 
            // 교체
            answer.pop_back();
            answer.push_back(ac_idx+1);
        }
        else if(ac[answer.back()-1== ac[ac_idx]) // 이전 대입과 같으면 
            answer.push_back(ac_idx+1); // 추가 (공동 순위 개념)
            
        ac_idx++// 다음 카운트랑 비교를 위해
    }
    return answer;
}
cs

 

인기있는, 다른 사람의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<int> one = {1,2,3,4,5};
vector<int> two = {2,1,2,3,2,4,2,5};
vector<int> thr = {3,3,1,1,2,2,4,4,5,5};
 
vector<int> solution(vector<int> answers) {
    vector<int> answer;
    vector<int> they(3);
    for(int i=0; i<answers.size(); i++) {
        if(answers[i] == one[i%one.size()]) they[0]++;
        if(answers[i] == two[i%two.size()]) they[1]++;
        if(answers[i] == thr[i%thr.size()]) they[2]++;
    }
    int they_max = *max_element(they.begin(),they.end());
    for(int i = 0; i< 3; i++) {
        if(they[i] == they_max) answer.push_back(i+1);
    }
    return answer;
}
cs

내가 푼거에 비해서 깔끔하다 나는 반복문 투성인데 여기에서는 answers를 기준으로 한번만 돌았다.. ㅋㅋㅋ max_element 함수로 최대 값을 구한 뒤, 최대 값과 같으면 순서대로 다 집어넣는다. 5졌습니다..

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

카카오톡 비밀지도  (0) 2021.02.18
SQL1  (0) 2021.02.15
벡터 복사 및 sort 이용  (0) 2021.02.13
우선순위 큐 이용한 문제 ㅋㅋ  (0) 2021.02.13
stack 주식 가격  (0) 2021.02.13
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

출처

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> part_vector;
    vector<int> answer;
    int i=0, j=0, k=0;
    
    // commands로부터 조건들을 꺼낸다.
    for(auto it=commands.begin(); it!=commands.end(); it++)
    {
        i = (*it)[0]-1, j = (*it)[1]-1, k = (*it)[2]-1// 1번째는 0번째이므로 -1 처리.
        
        part_vector.resize(j-i+1); // j-i+1 은 부분 벡터의 크기
        copy(array.begin()+i, array.begin()+j+1, part_vector.begin()); // 부분 벡터를 복사
        
        sort(part_vector.begin(), part_vector.end()); // 정렬(퀵)
        answer.push_back(part_vector[k]); // 정렬된 부분 벡터에서 k번째를 구함.
    }
    return answer; // 간단
}
cs
728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

SQL1  (0) 2021.02.15
무식하게 완전 탐색! - 모의고사  (0) 2021.02.15
우선순위 큐 이용한 문제 ㅋㅋ  (0) 2021.02.13
stack 주식 가격  (0) 2021.02.13
A집단과 B집단의 차이를 구할 때  (0) 2021.02.12
728x90
반응형

출처

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

  • 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
int solution(vector<int> scoville, int K) {
    priority_queue<intvector<int>, greater<int>> pq; // 우선순위 큐 | Min Heap
    // priority_queue<int, vector<int>, greater<int> > pq; // 우선순위 큐 | Max Heap
    int answer = 0;
    int n1, n2;
    
    for(auto n : scoville) 
        pq.push(n); // Min Heap의 우선순위 큐에 모두 때려 넣는다 -> 스코빌 지수가 작은 녀석들부터 순서대로 튀어나온다
    
    while(pq.size() > 1 && pq.top() < K) // 큐에 2개 이상 들어가야만 세그멘테이션 폴트 에러가 발생하지 않는다.
    {
        // 두 개를 뽑고,
        n1 = pq.top(); pq.pop();
        n2 = pq.top(); pq.pop();
        
        // 두 음식을 섞어서 새롭게 스코빌 지수를 하나 탄생시키고 넣으면
        pq.push(n1+n2*2); // 해당 힙에 구조가 조정되어 들어간다 -> Min Heap 계속 유지하기 때문에 top이 K 이상이라면 나머지 값들도 모두 K이상을 만족
        answer++;
    }
    
    if(pq.top() < K) // 위 과정을 거쳤는데도 K 이상을 충족하지 않는다면
        return -1// 더 이상 조합으로는 K 이상으로 맞출수 없다는 소리이다. 음식이 1개 남았고, K미만인 경우임.
    
    return answer;
}
cs

 

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

SQL1  (0) 2021.02.15
무식하게 완전 탐색! - 모의고사  (0) 2021.02.15
벡터 복사 및 sort 이용  (0) 2021.02.13
stack 주식 가격  (0) 2021.02.13
A집단과 B집단의 차이를 구할 때  (0) 2021.02.12
728x90
반응형

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

prices [1, 2, 3, 2, 3] return [4, 3, 1, 1, 0]
  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

내 풀이

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

using namespace std;

vector<int> solution(vector<int> prices) {
    vector<int> answer;
    int cnt;

    for(auto it=prices.begin(); it!=prices.end(); it++) // 순차적으로 하나씩 접근
    { // 여기서 현재 잡고 있는 it가 비교의 기준임.
        cnt = 0;
        for(auto eit=(it+1); eit!=prices.end(); eit++) // 바깥 반복에서 접근한 요소 다음 요소들을 모두 확인한다
        {
            cnt++;
            if((*eit)-(*it) < 0) // 비교의 기준 it 보다 작아지는지 확인
            { // 작아지면
                answer.push_back(cnt); // 그 때의 카운트를 넣는다
                cnt = -1; // 카운트가 등록되었으니 의미 없음 이제.
                break;
            }
        }
        if(cnt != -1) // 끝까지 작아지지 않았다면 
            answer.push_back(cnt); // 총 카운트를 넣는다.
    } // 그리고 다음 요소를 기준으로 변경한다 

    return answer;
}

인기 풀이

#include <string>
#include <vector>
#include <stack>

using namespace std;

vector<int> solution(vector<int> prices) {
    vector<int> answer(prices.size());
    stack<int> s;
    int size = prices.size();
    for(int i=0;i<size;i++){
        while(!s.empty()&&prices[s.top()]>prices[i]){
            answer[s.top()] = i-s.top();
            s.pop();
        }
        s.push(i);
    }
    while(!s.empty()){
        answer[s.top()] = size-s.top()-1;
        s.pop();
    }
    return answer;
}

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

SQL1  (0) 2021.02.15
무식하게 완전 탐색! - 모의고사  (0) 2021.02.15
벡터 복사 및 sort 이용  (0) 2021.02.13
우선순위 큐 이용한 문제 ㅋㅋ  (0) 2021.02.13
A집단과 B집단의 차이를 구할 때  (0) 2021.02.12

+ Recent posts