나 개발자 진짜 되냐?

코딩테스트 입문 - 공 던지기 ( vector 친구들, rotate ) 본문

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

코딩테스트 입문 - 공 던지기 ( vector 친구들, rotate )

Snow Rabbit 2026. 5. 1. 04:16

 

반갑습니다.

문제가 점점 어려워져서

1일 1 글이 아니라 4 글이 되어가고 있습니다.

 

큰일입니다.

 

제가 이렇게 나약했나요.

이걸 다 이해하고 습득하는것도 백만 년 걸릴지도 모르겠군요.

 

이래저래 걱정이 많습니다.

 

오늘은 벡터의 친구들을 상세하게 알아볼 계획입니다.


 

이 문제는 사실 이론상? 쉽다.

그냥 왼쪽에 있는거 하나만 옮기면 되는데..

 

내가 생각했던 문제는 뭐냐..

 

한 칸 옮기면..

애들이 하나씩 미뤄지지 않을까? 였다.

for문을 써서 한칸씩 이동시켜야 하나..?

근데 그렇게 비효율적일까?

아닌가 20개라서 그렇게 비효율적이진 않을 거 같긴 하다.

 

그래도 인지 씨에게 물어봤다.

물어본 건

최적의 효율적 풀이였다.

 

두 가지라고 하며 하나씩 풀어보자고 했다.

 

Vector과 친구들

 

맨 앞을 확인하는 친구

v.front()

맨 앞에 누가 있는지 알려줍니다.

 

 


맨 뒤를 확인하는 친구

v.back()

맨 뒤에 누가 있는지 알려줍니다.

 

 

 


맨 뒤에 글자를 붙이기

v.push_back(값)

늘 하던 거 push_ back 말 그대로 뒤에 붙인다.

 

 

 


맨 뒤에 글자를 빼기

v.pop_back()

약간 스택 이런 친구처럼 pop를 쓴다.

 

 

 


맨 앞에 글자를 붙이기

v.insert(v.begin(), 값)

insert를 쓰고 맨 앞에 라고 표시 후 값을 적어준다.

 


맨 앞에 글자를 빼기

v.erase(v.begin)

erase로 쓰며 맨 앞을 지운다는 뜻

 

 

스택이랑 약간 비슷해서

외우는데 큰 무리는 없을 거 같다.

 

벡터의 도구들을 알아봤다.

 

 

짜잔! 완성

 

그럼 이제 인지 씨가 말한 2번은 뭘까

최적화 알고리즘이 있다고 했다.

 

그 친구 이름은

rotate

이 친구를 쓰려면

늘 그랬듯

<algorithm>을 추가해줘야 한다.

 

rotate는 3가지 정보가 필요하다.

rotate(시작점, 누가 첫 번째에 올건지, 끝점);

자, left부터 보자

두 번째에 있던 애가 첫 번째로 오게 된다.

 

그래서

시작점은 begin()

1등 자리는 begin() + 1

끝점은 end()

 

rotate(numbers.begin(), numbers.begin() + 1, numbers.end());

 

그럼 right의 경우는 뭘까?

맨 뒤에 있는 애가 첫 번째로 오게 된다.

 

시작점

시작점은 begin()

1등 자리는 end() - 1

끝점은 end()

 

rotate(numbers.begin(), numbers.end() - 1, numbers.end());

 

그리고 좋은 친구 하나 더 있다고 알려주었다.

 

rbegin()이라고 컴퓨터가 친히 거꾸로 보기 시작한다.

 

 

rotate(numbers.rbegin(), numbers.rbegin() + 1, numbers.rend());

 

이렇게 해주면 아까식이랑 같아서 좀 편하다는 거?

 

두 칸씩 늘리고 싶으면 +2 세 칸이면 +3 이렇게 해준다.

 

 

답은 이렇게 나온다.

 


 

어려운 문제를 풀었다.

 

rotate라는 친구도 배웠고

vector의 새로운 친구들도 많이 배웠다.

 

배울 게 너무 많다.