나 개발자 진짜 되냐?

[ C++ ] 프로그래머스 - 중요한 단어를 스포 방지 ( set, substr, find ) 본문

프로그래머스를 풀어보아요!/C++

[ C++ ] 프로그래머스 - 중요한 단어를 스포 방지 ( set, substr, find )

Snow Rabbit 2026. 6. 19. 02:08

 

반갑습니다.

 

오늘은 정답률이 낮은 친구를 데려왔습니다.

 

사실문제도 제대로 이해했는지 잘 모르겠네요.

 

한번 인지씨 없이 도전해 보겠습니다.


 

후후...

문제를 이해해 보니..

0부터 3까지 일단 가리고 23부터 28까지 가리게 된다.

그러면.. 맨 앞 here와 secret가 가려지게 되는데

here는 뒤에 here가 나오기 때문에 가려져봤자 스포가 이미 되어버렸으니 X

secret는 없는 단어이기 때문에 스포 안 됐으니 O

그래서 1이 되는 거 같다.

 

중요한 것은 두 번째에서

phone에서 o만 가려졌는데

스포가 열릴 때는 단어 전체로 열리게 된다고 한다.

하지만 여기 53 59에 의해

phone number

로 가려져서 phone이라는 글자는 없기에 스포가 안된 것으로 판단하게 된다.

 

오케이 문제는 이해했는데...

 

어떻게 풀지..?!?!

 

...

일단 대충 풀어봤다.

 

 

내 계획은.

message의 스포글자를 띄어쓰기로 만들어두고

그 글자들을 벡터에 담아둔다.

그다음에

message를 띄어쓰기로 나누고

글자를 찾지 못하면 그것은 스포 하지 않았을 테니 answer++를 해주었다.

 

 

아니 근데 테스트가 이상하다.

 

아니 위에서 스포일러 크기만큼 돌렸는데

도대체 11이 어떻게 나오는 것인가.......

 

 

스포글자만 출력해 봤다.

저 진짜 one num 저 녀석이 문제였다.

아마 벡터에 one num으로 되어있어서

find로 찾을 수 없었을 것이다.

 

그러면.. 어쩌지..?

 

결국 인지 씨를 찾았다.

 

인지 씨는...

글자수를 쪼개는 방법을 사용할 경우..

원본데이터도 따로 만들어 줘야 한다고 했다.

 

즉,

원본 데이터 글자하나하나를 벡터에 넣어준 다음에,

스포구간을 스페이스로 밀어버리고

남은 글자들을 또 넣어주고..

넣어주고...

 

해야 한다.

...

 

자!

다시

 

1.

원본 데이터 글자를 하나하나 벡터에 넣어준다. ( 이따 중요 단어랑 비교하기 위해 )

 

 

2.

스포 구간을 스페이스로 만들기

 

 

3.

공백으로 밀리고 남은 글자들은 스페이스로 나누었으니 그것들을 set으로 저장

 

왜 set 일까?

 

1. 중복 방지

2. find를 쓸 때 이거만큼 좋은 게 없다!

 

그래서 set을 써준다.

set에 넣어줄 땐 insert이다!

 

 

4.

이제 중요한 글자를 구분할 차례이다.

중복 방지를 위해서도 사용된다.

 

 

5.

 

여기서 이제 글자를 확인하는데,

원본 글자 = v

nor_w는 set이고

set에서 벡터의 words를 찾는다가 된다.

 

여기서 또 중요한 것!

find를 통해서 아무것도 못 찾을 경우

맨 끝까지 가게 된다.

그래서 저렇게 한다고 한다.

 

에? 

그럼 우리가 알고 있던 string::npos는 왜 안되나?

 

그 이유는 찾는 단어가

string일 때만 string::npos가 된다고 한다.

 

set이나 vector에 있으면 end로 해줘야 한다!

 

꼭 기억하자.

 

그리고 중복도 굉장히 중요하다고 한다.

 

왼쪽부터 오픈하는데

phone의 경우

처음에 오픈될 때 

뒤에 phone number는 가려져있어서 패스하게 된다.

그래서 이 친구는 중요글자이고

후에

phone가 또 나오는데 이때는 이미 중요한 글자가 되었기 때문에

굳이 중요글자를 카운트할 필요가 없다.

그래서 중복이 중요하다..

 

 

그래서 전체코드는

 

가 된다.

 

 

 

무슨 테스트가 77개나 되는가..

 

이럴 수가.

이것도 틀리는가?

 

 

ㅋㅋ

인지 씨에게 최고의 답을 물어봤다.

 

인지 씨는 그재서야..

bool과 set을 이용하라고 이야기해 주었다......

 

WHY!!!

이제 이야기해 주는 것인가.

 

 

 

자,

하나씩 다시 해보자.

 

먼저 bool값을 만든다.

이 bool값은 스포일러 구간을 만들어 두는 것이다.

글자를 하나하나 자르면 시간이 오래 걸리기 때문에.

bool 값을 통해

0부터 3까지는 스포방지구간이라고 체크해 두는 것이다.

범위 중요하다!!!!

문제에서도 처음과 끝이라고 정확히 적어두어서

<=

적어야 한다.

 

 

 

스포 글자를 담을 vector

그리고 스포가 아닌 친구는 set

에 담는다

사실 둘 다 set으로 해도 되는데

후에 우리는 중요 글자를 스포에서 꺼내야 하기 때문에

vector로 해준다.

 

 

여기가 정말 중요한데..

어려워서 하나하나 주석을 달아봤다.

 

스포글자와 스포 아닌 글자를 구별하는 것이다.

 

시작점을 i로 정해두고

뭐 예를 들면 3이라고 하자.

그럼 wordStart도 3이 된다.

그다음 공백이나 끝을 만나면 글자는 완성

그럼 이제 그 글자를 잘라서 스포인지 아닌지 알아야 한다.

else로 들어가서

단어를 그만큼 자르고

한 글자씩 돌면서

 

맨 위에 우리가 스포방지구간을 만들었었다.

그 구간에 한글자라도 들어가 있으면

이 친구는 스포글자기 때문에

 

중요도 체크를 해줘야 한다.

그래서 마지막 두줄로 분류하고

다음 글자를 위해 -1로 초기화한다.

 

마지막으로

중복 방지용 set을 만들어두고

 

스포가 아닌 글자들에 혹시나 스포글자가 있나!

here의 경우 여기에 들어가게 된다 그래서 answer++이 안된다.

 

그리고 혹시 중복 됐나?

phone의 경우 여기로 들어가게 된다.

중복이 없으면 들어와서 answer++ 가 되고

그래서 두 번째  phone는 들어오지 못했다.

 

그래서 결과는..?!?!

 

ㅇㅅㅇ..


 

진짜 이렇게 어려웠는데 6점? 진짜 거짓말이다..

 

진짜 거짓말이다...

생각해 보면 어어어엄청 어렵진 않았는데..

뭐랄까..

어렵다...

어렵다...

익숙하지 않은 건가?

뭔가 엄청 어려운데 이게 1단계라니 왕 거짓말쟁이들..

 

이제 안 믿어!!!!!