하루하루 꾸준히, 인생은 되는대로

정렬

백준 20551 Sort 마스터 배지훈의 후계자

긤효중 2022. 8. 6. 23:03

https://www.acmicpc.net/problem/20551

 

20551번: Sort 마스터 배지훈의 후계자

지훈이는 Sort 마스터다. 오랫동안 Sort 마스터 자리를 지켜온 지훈이는 이제 마스터 자리를 후계자에게 물려주려고 한다. 수많은 제자들 중에 후계자를 고르기 위해서 지훈이는 제자들에게 문제

www.acmicpc.net


문제

지훈이는 Sort 마스터다. 오랫동안 Sort 마스터 자리를 지켜온 지훈이는 이제 마스터 자리를 후계자에게 물려주려고 한다. 수많은 제자들 중에 후계자를 고르기 위해서 지훈이는 제자들에게 문제를 준비했다. 먼저 제자들에게 N개의 원소를 가진 배열A를 주고, A의 원소들이 오름차순으로 정렬된 배열B를 만들게 한다. 그다음 M개의 질문을 한다. 각 질문에는 정수 D가 주어진다. 제자들은 주어진 정수D가 B에서 가장 먼저 등장한 위치를 출력하면 된다. 단, D가 B에 존재하지 않는 경우에는 -1를 출력한다. Sort 마스터의 자리를 너무나도 물려받고 싶은 창국이를 위해 지훈이의 문제를 풀 수 있는 프로그램을 만들어 주자.


입력

첫째 줄에 배열A의 원소의 개수 N과 질문의 개수 M이 공백으로 구분되어 주어진다.

다음 줄부터 N줄에 걸쳐 정수 A0,A1,...,AN−1이 주어진다.

다음 줄부터 M줄에 걸쳐 정수 D가 주어진다.


먼저 이번 문제는 cin cout를 써서 처음에 시간초과를 받았습니다.

그래서 입출력을 scanf, printf로 바꾸었고 제출하였습니다.

 

문제를 보면 일단 N개의 원소를 가진 배열 A가 있고, A의 오름차순 배열된 것을 배열 B라고 합니다.

그다음 M개의 질문이 주어지는데 각 질문마다 정수 D가 주어집니다.

정수 D가 배열 B에 있으면 첫번쨰 등장한 인덱스를 출력하고, B에 없다면 -1을 출력하면 되는 문제였습니다.

 

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
 
int n,m;
int arr[300000];
int main(void){
    scanf("%d %d",&n,&m);
 
    for(int i = 0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    sort(arr,arr+n); 
    map<int,int> Mymap;
    map<int,int>::iterator iter;
 
    for(int i = 0;i<n;i++){
        iter = Mymap.find(arr[i]);
        if(iter == Mymap.end()){
            Mymap.insert({arr[i],i});
        }
        else{
            continue;
        }
    }
 
    for(int i = 0;i<m;i++){
        int query;
        scanf("%d",&query);
        iter = Mymap.find(query);
        if(iter != Mymap.end()){
            int N = iter->second;
            printf("%d\n",N);
        }
        else{
            printf("-1\n");
        }
    }
}

 

'정렬' 카테고리의 다른 글

2차원 배열에서 이분 탐색 사용하기  (0) 2022.12.27
Find First and Last Position of Element in Sorted Array C++  (0) 2022.12.25
백준 2693 C언어  (0) 2021.10.08
백준 11399 C언어  (0) 2021.10.04
백준 1026번 C언어  (0) 2021.10.01