programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

코드 설명

 

priorities배열에 따라 큐에 전부 넣어준후 뒤쪽을 전부 탐색한다.

중요도가 큰게있다면 뒤로 넣어주고 priorities 배열 자체도 바꿔준다.(문제를 더 단순하게)

또한, 큐에 담아줄때는 pair를 이용하여 각각의 원래 location 위치를 달아주고 수정한다.

 

문제에서 요구한 answer++ 시점을 잘 잡아주자 ! 여기서 실수발생

 

 

 

코드

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

int solution(vector<int> priorities, int location) {
    int answer = 0;
    queue<pair<int,int>> q;
    
    for(int i=0;i<priorities.size();i++){
        q.push({priorities[i],i}); //이름표마냥 location값 붙여두기
    }
    
    while(!q.empty()){
        bool flag=false;
        int a=q.front().first;
        
        for(int i=0;i<priorities.size();i++){
            if(a < priorities[i]){
                flag=true;
                break;            
            }
            
        }

        if(flag==true){ // 뒤쪽에 중요도 큰게 있음
            q.push({q.front().first,q.front().second});
            q.pop();
            int temp=priorities[0];
            priorities.erase(priorities.begin());
            priorities.push_back(temp);
            
            
        }
        else{ // 뒤쪽에 중요도 큰게 없음 
            answer++;
            if(q.front().second == location ){
                break;
            }
            
            q.pop();
            cout << priorities[0] << " " ;
            priorities.erase(priorities.begin());
            
        }
        
        
        
    }
    
    
    
    return answer;
}

programmers.co.kr/learn/courses/30/lessons/42586#

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

코드 설명

큐를 이용하여 100을 넘길시 pop시킨다 (cnt를 통해 while문이용)

 

progresses 인덱스와 speeds 인덱스를 각각 어떻게 매번 더해줄까 생각하다가 그냥 큐에있는것을 하나씩 빼서 더한후 다시 push해주는 방법을 이용하였다.(단순..)

 

IDE를 쓰지 않으려는 연습을 계속하다보니까 core dumped가 너무 자주 발생한다...설계를 정확히하고 짧은 구문마다 디버깅을 해보자 

 

 

이번에도 while(q.front()>100) 만하고 큐가 비어있는 상황을 위에서 if문으로 그냥 해버리니까 당연히 while문 내에서 큐가 비는 상황이 발생한다....조심하자!

코드

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

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    queue<int> q;
    for(int i=0;i<progresses.size();i++){
            q.push(progresses[i]);
            
        }
    
    while(1){
        int cnt=0;
        
        
        
    while(q.front()>=100 && !q.empty()){
        
            if(q.front()>=100) cnt++;
            q.pop();
            progresses.erase(progresses.begin());
            speeds.erase(speeds.begin());
            
        }
        
        
        
        
        for(int i=0;i<speeds.size();i++){
            int temp=q.front()+speeds[i];
            cout << q.front() << temp << endl;
            q.pop();
            q.push(temp);
        }
        
        
        if(cnt>0) answer.push_back(cnt);
        if(q.empty())break;
    }
    
    
    return answer;
}

'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 더 맵게  (0) 2021.05.01
[프로그래머스] 프린터  (0) 2021.04.30
[프로그래머스] 타겟넘버  (0) 2021.04.27
[프로그래머스] 입국심사  (0) 2021.04.27
[프로그래머스] H-Index  (0) 2021.04.27

https://programmers.co.kr/learn/courses/30/lessons/43165

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+

programmers.co.kr

코드 설명

연산 (-,+)을 branch로 생각하여 DFS를 구성하였다.

처음 main문에서 넘겨주는 값을 number[level]로 했다가 바닥조건에서 이를 고려안해서 실수했다....

프로그래머스 환경에서 dfs 디버깅은 좀 쉽지 않은것 같다...

 

코드

#include <string>
#include <vector>

using namespace std;
int arr[2]={-1,1};
int answer=0;
void dfs(int level,int now,vector<int>&numbers,int target){
    if(level==numbers.size()){
        if(now==target) answer++;
        return;
    }
    for(int i=0;i<2;i++){
        int sum=numbers[level]*arr[i];
        now+=sum;
    
        dfs(level+1,now,numbers, target);
        now-=sum;
        
    }
    
}
int solution(vector<int> numbers, int target) {
    
    
    int n=numbers.size();
    dfs(0,0,numbers,target);
    
    return answer;
}

'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 더 맵게  (0) 2021.05.01
[프로그래머스] 프린터  (0) 2021.04.30
[프로그래머스] 기능개발  (0) 2021.04.30
[프로그래머스] 입국심사  (0) 2021.04.27
[프로그래머스] H-Index  (0) 2021.04.27

 

https://programmers.co.kr/learn/courses/30/lessons/43238

 

코딩테스트 연습 - 입국심사

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한

programmers.co.kr

코드 설명 

시간 이라는 개념을 이분탐색으로 찾아야 한다는게 포인트이다.

최소값은 1분 ~ 최대값은 times가 가진 최대 시간 * n(사람수) 이다.

그 후, mid시간 동안 몇명을 검사 할수 있는지 cnt를 통해 구한다. ( 구하는 법은 시간/times[i])

 

또한 최대값을 설정할때 long long 설정에 유의하자!

long long endd=n*(long long)times[k-1];

 

코드

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

long long solution(int n, vector<int> times) {
    long long answer = 0;
    //입국심사 사람 1,000,000,000 => longlong 이분탐색 생각!
    sort(times.begin(),times.end());
    long long k=times.size();
    long long startt=1;
    long long endd=n*(long long)times[k-1];
    long long cnt=0;
    
    
    while(startt <= endd){
    long long midd=(startt+endd)/2;
        cnt=0;
     for(int i=0;i<k;i++){
        cnt += midd/times[i]; //시간당 심사인원한명이 심사할수 있는 인원수 합
    }
       
        if(cnt<n){  // 불가능
            startt = midd+1;    
        }
        else{ //가능 
            //최소시간 구하기
            answer=midd;
            endd=midd-1;
        }
        
    
    }
    
    
    
    return answer;
}

'알고리즘 공부 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 더 맵게  (0) 2021.05.01
[프로그래머스] 프린터  (0) 2021.04.30
[프로그래머스] 기능개발  (0) 2021.04.30
[프로그래머스] 타겟넘버  (0) 2021.04.27
[프로그래머스] H-Index  (0) 2021.04.27

+ Recent posts