알고리즘/BOJ

백준 13701번 중복 제거

꾸준함. 2018. 4. 8. 02:33

문제 링크입니다: https://www.acmicpc.net/problem/13701


http://donggod.tistory.com/54을 참고하였습니다.

메모리 제한이 다른 문제들과는 달리 고작 8MB이기 때문에 배열, 벡터, 링크드리스트와 같은 자료구조는 모두 사용할 수 없는 문제였습니다.

따라서 비트를 사용해야 했는데 int는 32비트이므로 비트를 최대 32개 사용할 수 있고 8MB(2^3 * 2^20)는 2^23이기 때문에 비트마스크를 이용해야지만 풀 수 있는 문제였습니다.


#include <cstdio>

//#include <iostream>

//using namespace std;

 

//c++는 헤더파일이 무거우므로 실행시간 면에서 불리

//cout, cin으로 코드 작성할 경우 시간초과

 

int arr[(1 << 25) / 32]; //8MB = 2^25, int 32비트

 

int main(void)

{

        int num;

        //-1 4바이트에서 비트로 표현하면 0xFFFFFFFF인데,

        //이를 비트 반전 시키면 0x00000000,

        //다시 말해 ~scanf("%10s", s)에서 입력이 더 이상 들어오지 않을 경우 0

        while (~scanf("%d", &num))

        {

               int quotient = num / 32; //int 32비트

               int remainder = 1 << (num % 32); //나머지

 

               //몫을 배열의 인덱스

               //나머지를 해당 인덱스의 값

               if (!(arr[quotient] & remainder))

               {

                       arr[quotient] += remainder;

                       printf("%d ", num);

               }

        }

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1402번 아무래도이문제는A번난이도인것같다  (0) 2018.04.27
백준 5913번 준규와 사과  (0) 2018.04.13
백준 2629번 양팔저울  (3) 2018.04.08
백준 1978번 소수 찾기  (0) 2018.04.03
백준 2839번 설탕 배달  (0) 2018.03.31