inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

75. 최대 수입 스케쥴(priority queue greedy: 구조체와 Vector를 이용한 정렬)

구조체를 사용해 우선순위 큐를 사용하던중 이 코드가 왜 틀리는 건지 모르겠습니다.

535

박효정

작성한 질문수 4

0

안녕하세요! 좋은 강의 찍어주셔서 감사합니다.!

구현체를 사용하여, 우선순위 큐를 구현해 문제를 풀었는데, 틀렸다고 떠서요.

동일 코드를 pair를 사용해 우선순위 큐 구현하여 코드를 올리면 맞았다고 뜹니다. 혹시 제가 잘못 사용했거나, 놓친 부분이 있을까요?

(문제 링크입니다:

https://www.acmicpc.net/problem/13549)

//정답 코드 
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

int vis[200001];

int main(){

    cin.tie(0);
    cout.tie(0);
    std::ios::sync_with_stdio(false);


    int n,k;
    cin>>n>>k;

    priority_queue <pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> >> pq;
    pq.push({0,n});
    vis[n]=1;
    int res=987654321;
    while (!pq.empty()) {
        int move=pq.top().second;
        int cnt=pq.top().first;
        pq.pop();
        if(move==k){
            res=cnt;
            break;


        }

        if(move*2<=200000&&vis[move*2]==0){
            pq.push({cnt,move*2});
            vis[move*2]=1;
        }


        if(move-1>=0&&vis[move-1]==0){
            pq.push({cnt+1,move-1});
            vis[move-1]=1;
        }
        //한칸 뒤 이동
        if(move+1<=200000&&vis[move+1]==0){
            pq.push({cnt+1,move+1});
            vis[move+1]=1;
        }



    }


    cout<<res<<"\n";


    return 0;
}

//틀린코드 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>

using namespace std;

int vis[200001];

struct qu{
    int m,val;
    
    qu(int a,int b){
        m=a;
        val=b;
    }
    
    bool operator<(const qu & b)const{
        return val>b.val;
    }
};


int main(){
    
    cin.tie(0);
    cout.tie(0);
    std::ios::sync_with_stdio(false);
    
    
    int n,k;
    cin>>n>>k;
    
    priority_queue<qu>pq;
    pq.push(qu{n,0});
    vis[n]=1;
    int res=987654321;
    while (!pq.empty()) {
        int move=pq.top().m;
        int cnt=pq.top().val;
        pq.pop();
        if(move==k){
            res=min(cnt,res);
            break;
          
         
        }
        
        if(move*2<=200000&&vis[move*2]==0){
            pq.push(qu(move*2,cnt));
            vis[move*2]=1;
        }
      
      
        if(move-1>=0&&vis[move-1]==0){
            pq.push(qu(move-1,cnt+1));
            vis[move-1]=1;
        }
        //한칸 뒤 이동
        if(move+1<=200000&&vis[move+1]==0){
            pq.push(qu(move+1,cnt+1));
            vis[move+1]=1;
        }
       
       
        
    }
    
    
    cout<<res<<"\n";
    
    
    return 0;
}


C++ 코테 준비 같이 해요!

답변 1

1

김태원

안녕하세요^^

구조체 정렬기둔 함수를 아래와 같이 바꾸시면 될겁니다.

bool operator<(const qu & b)const{

    if(val==b.val) return m>b.m;

        return val>b.val;

    }

테스트 케이스 질문

0

389

1

병합정렬 시간복잡도 질문

0

475

1

41.연속된 자연수의 합 문제풀이에서 수학적인 원리를 모르고 있습니다.

0

1365

2

질문드립니다.

0

391

1

질문드립니다!

0

437

1

dev 프로그램 질문

0

276

1

문제가 이해가 안되요

0

379

1

4번 나이차이 문제 접근법 질문 드립니다.

0

308

1

source file not compiled

0

1066

3

59번 질문드립니다.

0

374

1

25번 문제 질문

0

351

1

4. 나이차이 문제 질문입니다.

0

377

1

90번 라이언 킹 심바 1번 테스트 케이스

0

472

1

71번 문제 전역 변수 질문 있습니다

0

366

1

75번, 79번 priority_queue관련

1

361

1

75.최대 수입 스케줄

0

404

2

복면산 정답의 수

0

437

1

테스트 케이스에 대해서

0

450

1

수업 내용 질문입니다!

1

236

1

풀어보면 좋은 문제 목록 - 2580 스토쿠 DFS 질문입니다!!

0

840

2

12. 플로이드-와샬(그래프 최단거리) . 27:25초

0

257

1

다른 풀이 방식

0

318

1

크루스칼 vs 프림

0

313

1

숫자 총개수 small 질문있습니다.

0

246

1