프로그래밍/코딩테스트

[백준] 5597번, sort사용법 (c++)

gameObject 2023. 10. 16. 20:39
728x90

문제

 

풀이방법

1. 나는 처음 28번까지 입력을 받은 뒤, 정렬을 시킨 후 1번부터 30번까지 하나하나 체크를 해서 배열 위치에 없다면 i를 print하는 방식으로 문제를 해결하려고 했다.

 

하지만 정렬을 사용하는 방법을 까먹어서 검색하였다.

 

sort함수

- #include<algorithm> 에 포함되어 있다.

- 사용방법은 sort(n, n+28) >> 즉 첫번째 값이 시작되는 주소위치, 끝 값의 주소위치를 지정해주면 알아서 오름차순 정렬을 해준다.

- sort(begin,end), 범위는 begin <= 배열 < end 이다.

2번째 작성코드를 보면

sort(n, n+28)이라고 하였는데 

배열 n[28] = {0,}에서 n이 배열의 포인터, 시작지점이며 두번째 배열의 크기를 더해주면 끝 지점을 나타내 줄 수 있다.

 

** #include<algorithm>의 sort정렬은 최악의 경우에도 시간 복잡도를 nlogn을 보장하는 정렬 알고리즘이라고 한다.

첫번째 작성코드

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    int n[28] = {0,};
    int a;
    
    for(int i = 0; i < 29; i++)
    {
       cin >> a;
       n[i] = a;
    }
    sort(n,n+28);
    
    for(int i = 1; i<=30; i++)
    {
        if(i != n[i]) printf("%d\n",i);
    }
}

문제는 출력부분에서 i를 동시에 비교를 하게되면 

한번 안맞는순간 하나씩 밀리게 되어 원하는 출력값을 얻을 수가 없다.

 

따라서 다른 변수를 지정해주어 해결해 주었다.

 

두번째 작성코드 (정답)

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n[28] = {0};
    int a;
    
    for(int i = 0; i < 28; i++)
    {
        cin >> a;
        n[i] = a;
    }
    sort(n, n + 28);
    
    int j = 0;
    
    for(int i = 1; i <= 30; i++)
    {
        if (i != n[j])
        {
            cout << i << endl;
        }
        else
        {
            j++;
        }
    }

    return 0;
}

 

728x90