나 개발자 진짜 되냐?

코딩테스트 입문 - 옹알이 (1) ( replace, erase, remove ) 본문

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

코딩테스트 입문 - 옹알이 (1) ( replace, erase, remove )

Snow Rabbit 2026. 5. 20. 19:13

 

 

예전에는 책을 가까이 두지 않았다.

음...

책보다는 영화가 몰입이 더 쉬웠던 거 같고..

책을 오랫동안 앉아서 보는 게 어려웠다.

 

최근에

누가 나에게 

다정함은 체력에서 오는 거라고 흘려 이야기했었다.

 

사실 반은 믿지 않았다.

다정함은 몸에 밴 행동이라고 생각했다.

 

걷다 보면

상대가 추워 보이는 게 눈에 보이고

그럼 내 옷을 벗어주고 싶기 마련이니까

 

근데 며칠 전에 도서관에서

 

이 책을 발견했다.

 

피곤하면 타인을 배려할 여유도 사라지기 때문에

'다정함은 체력에서 나온다'는 말이 핫해졌다고 한다.

 

다정함은 체력이고 배려는 지능이다

라는 말을 보며..

 

나는 꽤 지능이 높은 사람이구나

라는 생각을 했다 ㅎ

 

다음에 시간이 나면

읽어보고 싶은 1순위 책이 되었다.


 

 

find으로 찾으면 좋지만..

문제는 uuuma의 경우

u는 3개 찾을 수 있지만..

a가 하나 부족하기 때문에 답이 될 수 없다.

 

이러면 사실 소거법이 가장 좋지 않나?라는 생각이 든다.

 

인지 씨에게 도움을 요청했다.

 

소거법을 하면 문제가 발생한다고

 

예시 1번에서 wyeoo 를보고

만약에 ye를 지우면

woo가 되어서 둘 다 소거가 된다는 것이다.

사실 안되는 건데 말이다.

 

그래서 이 친구는 소거가 아니라 replace 하라고 했다.

 

 

replace

어디서부터 몇 글자를 지우고 뭘 넣을지

정확하게 숫자로 알려줘야 한다!

 

그래서 우리는 시작위치를 알아야 한다.

 

아마 find로 찾아서

 그 위치를 int로 받으면 될 것이다.

 

int pos = a.find(b);

 

몇 글자를 지우는 것은

b의 길이만큼 지워야겠죠.

 

b.length()

 

우리는 " " 빈통으로 바꾸기로 했으니

 

" "

 

a.replace( pos, b.length(), " " )

 

이렇게 하면 된다.

 

자, 이렇게 돌면

같은 단어들은 공백으로 변신해 있을 것이다.

 

그 공백을 2중 포문으로 해서

char로 하나씩 돌면서 공백이 아닌 게 하나라도 있으면 걘 거르고

공백들 뿐이면 ++ 해주는 방식

이 있고

 

너무 길어서 귀찮다고 말했더니

 

그럼 공백을 다 erase + remove 해주고  empty로 찾자고 알려주었다.

 

 

remove

앞으로 옮긴다. 당긴다 라는 뜻

remove( 시작 위치, 끝나는 위치, 찾을 목표물 );

로 이루어져 있고

보통 시작 위치와 끝나는 위치는

begin, end이다.

 

이 문제에서는

공백을 찾아야 하니까 공백을 찾는다.

 

여기서 중요한 게

공백을 지워주는 느낌이 아니다.

공백을 제외한 다른 단어들을 앞으로 다 당겨주고

나머지들은 맨 뒤로 당겨둔다.

 

그래서 맨뒤에는

공백이랑 마지막 값 등 여러 쓰레기값이 들어가 있다.

 

remove는 쓰레기 값 바로 앞까지의 위치를 반환한다.

 

아 이해하는데 백만 년걸렸... 네...;

 

erase

어디서부터 몇 글자 자를까?라는

 

이 문제에서는

remove로 쓰레기 앞까지 위치를 받았으니

거기서부터 end까지 싹 둑 해준다.

 

str.erase( remove( str.begin(), str.end(), ' ') , str.end() );

이 문장은 오래오래 기억하도록 하자.

 

그리고 뭐 마지막엔

 

if(a.empty) answer++;

해주면 끝!

 

 

 

아니 그러더니 갑자기 왕 쉬운 방법이 있다고 알려주었다.

 

find로 글자를 찾고

글자 수만 어딘가에 저장한다.

 

그다음에 다 돌고 나서

babbling 에있는 글자 길이랑 내가 저장한 글자수가 같으면 그냥 cnt++ 해주면 된다.

 

for(auto& a : babbling) {
    int total_len = 0;
    
    for(auto& b : s) {
        if(a.find(b) != string::npos) { 
            total_len += b.length(); 
        }
    }
    
    if(total_len == a.length()) {
        answer++;
    }
}

 

이렇게..!

 


 

이렇게 많이 알고리즘을 썼는데..!!

1점이라니

서운하네

 

replace, remove, erase를 배웠다.

 

erase는 어디서부터 어디까지 지운다. 값 2개 필요

remove는 목표물을 빼고 다 앞으로 당긴다. 범위 2개 + 목표물 1개 값 3개 필요

replace는 어디서부터 몇 글자를 다른 값으로 바꾼다. 값 3개 필요

 

잊지 말자.

 

earse와 remove를 잘 활용하는 날이 오길