나 개발자 진짜 되냐?

백준 C++ 3052번 나머지 ( sort, unique, erase, set ) 본문

C++을 시작해봐요!/단계문제를 풀어보아요!

백준 C++ 3052번 나머지 ( sort, unique, erase, set )

Snow Rabbit 2026. 2. 19. 23:56

 

설 연휴는 다들 잘 보내셨나요?!?!?!?!

 

저는 설연휴에 가족끼리 떡국도 먹고

놀러가서 기념 팔지도 맞췄습니다 ㅎㅎ

 

올해는 정말 좋은일이 가득하길 기대하고싶어요 ㅎㅎ

 

누군가가 이 글을 읽는다면

즐겁고 행복하고

무엇보다 건강한 일만 가득하길 바라겠습니다.🙏🙏🙏

 

음음.. 그래서!

오늘의 문제는!

풀 땐 쉬웠는데..

풀이법이 많아서!

 더 쉬운 방법을 찾아 나서는

 


 

 

풀기는 금방 풀었다

42로 나눈 나머지라고 했으니

일단 값을 나눠서 배열에 넣어두고

cnt를 출력하도록 했다.

 

사실은 벡터로 하고 싶었는데

벡터로 어떻게 해야 하나.. 머릿속으로 잘 안 떠올라서 배열로 하게 되었다.

 

답은 맞았는데..

 

벡터로 하고 싶은 내 마음..!!

 

그래서 벡터로 했을 때 코드를 어떻게 써야 하는지 물어보았다.

 

vector <int> v(42,0);

이렇게 42개를 미리 만들고 0으로 초기화

 

v [a%42]++;

이렇게 해주면! 사실 똑같이 된다!!

 

벡터를 이렇게 써주면 좋지만

벡터에도 유용한 기능이 많다고 하며 나에게 맛있는 재료들을 알려주었다.

 

vector <int> v; 만 해주고

v.pushback(a%42);

해줘서 벡터에 그냥 넣는다

그럼 뭐 대충

1125342 이런 식으로 들어가면,

다음에

 

sort로 정렬을 해주고

sort(v.begin(), v.end());

 

1122345가 될 테니

 

v.erase(unique(v.begin(), v.end()), v.end());

이 식을 써주면 된다.

자 이게 무슨 뜻이냐!

 

unique 는 중복 원소를 맨 뒤로 빼주는 친구이다.

근데 이 친구 특징

1 2 2 1

이렇게 있으면 2만 중복인 줄 알고 

1 2 1 2 이렇게 배열한다.

즉 바로 옆에 친구만 중복인지 확인한다...

그렇기 때문에

정렬상태를 해놔줘야 한다. 그래서 우리는 위에 sort 해준 것..!!

 

특징이 하나 더 있다.

 

1 1 2 2로 두게 되면 

1 2 ( 1 2 )를 두게 된다.

괄호는 이제 버려질것들

하지만 버리지 않고 이 유니크라는 친구는 세 번째 주소를 반환한다.

 

그래서 그 값부터! 끝까지

erase 해주면 된다.

 

중복 제거했으니 남은 나머지의 개수가 곧 벡터 크기가 된다.

v.size를 출력!!!

 

 

 

이 sort과 unique를 쓰는 것

그리고 erase까지!

 

이 세 가지를 쉽게 해주는 친구가 있다.

 

이 중복을 제거해 주는 라이브러리가 존재한다.

 

그것은 set

 

set

벡터와 비슷한 집합 형태의 친구

하지만? 넣어주기만 하면

크기 순서대로 정렬 + 중복 거르기

 

위 세 가지를 합쳐놓은 간단한 친구 되겠다!

 

set을 쓰게 되면

세가지를 알아야 한다고 한다.

 

s.insert(값) : 값을 넣어준다.

( 이미 같은 값이 들어갔다면 아무 일도 일어나지 않는다. )

s.size()

서로 다른 값이 몇 개 들었는지 알려준다.

s.find()

값이 있는지 없는지 알려준다.

 

그래서 이걸 어떻게 쓰냐!!

 

vector 쓰듯이

set <int> s;

 

s.insert(a%42) 해주면 된다.

 

벡터처럼 쓰며

출력은 더 쉽게 for문을 안 써도 되고

s.size()를 출력하면 된다.

 

 

그럼 더 간단하게 된다!!


 

set을 기억할 수 있길 바라며..

 

sort, unique, erase를 다 기억할 수 있을까??

set을 내가 vector 대신해서 쓸 수 있을까?

쉽지 않지만...

기억할 수 있길..ㅎㅎ

 

고생했다. 하루도