인프런 커뮤니티 질문&답변

jjangye96님의 프로필 이미지
jjangye96

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

[필수개념] 조합(combination)

1차원 배열 회전 관련 질문

작성

·

50

0

안녕하세요

알고리즘 교안 > 1.12 코딩테스트 필수로직 > 1차원 배열회전 관련 공부를 하다 질문사항이 생겨 문의 드립니다.

 

// 반시계방향 문제 
//{1, 2, 3, 4, 5, 6} -> {1, 3, 4, 5, 2, 6}
rotate(v.begin() + 1, v.begin() + 2, v.begin() + 5);
// 시계방향 문제
// {1, 2, 3, 4, 5, 6, 7} ->  {5, 6, 7, 1, 2, 3, 4}
rotate(v.rbegin(), v.rbegin() + 2, v.rend()) // 6 7 1 2 3 4 5

저는 반시계방향 문제에서는 middle값이 v.begin()이 1을 가리키고 두칸 이동해서 3을 가리킨다고 이해했고

시계방향에서도 동일하게 v.rbegin()이 7을 가리키고 두칸 이동해서 5를 가리켜서 결과가 5, 6, 7, 1, 2, 3, 4 가 나올 것으로 기대했는데, 6, 7, 1, 2, 3, 4, 5 가 나오더라구요 ..

 

반시계방향 문제는 제가 이해한 방식으로 여러 다른 문제 풀어도 결과가 동일하게 나오는데 시계방향 문제에서는 제가 이해한 방식으로는 원하는 결과값이 나오지를 않는데, 어느 부분이 잘못된건지 알 수 있을까요?

답변 2

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

시계방향에서도 동일하게 v.rbegin()이 7을 가리키고 두칸 이동해서 5를 가리켜서 결과가 5, 6, 7, 1, 2, 3, 4 가 나올 것으로 기대했는데, 6, 7, 1, 2, 3, 4, 5 가 나오더라구요

>> 만약 6, 7 .. 을 원하시면 + 3을 하시면 됩니다. 이 이유는 rotate의 매개변수를 보시면 됩니다. rotate의 경우 두번째 매개변수를 포함하지 않고 그 이전까지 돌립니다.

즉, begin(), begin() + 2라고 했다면 첫번째, 2번째 까지만 돌리는 것이죠.

스크린샷 2024-08-26 오후 1.24.33.png

[는 포함한다.

)는 포함하지 않는다는 기호입니다.

 

반시계방향 문제는 제가 이해한 방식으로 여러 다른 문제 풀어도 결과가 동일하게 나오는데

>>

{1, 2, 3, 4, 5, 6} -> {1, 3, 4, 5, 2, 6}

이부분은 +1 은 2 부터시작 -> +5는 5까지의 범위를 의미합니다.

{1, 2, 3, 4, 5, 6}

여기서 +1에서 +2까지를 돌리기 때문에

{1, 3, 4, 5, 2, 6}

가 됩니다.


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

jjangye96님의 프로필 이미지
jjangye96
질문자

안녕하세요!

답변 감사히 잘 읽어봤지만, 제가 궁금한 지점이 아직 해결되지 않아서 다시 질문드립니다 ㅠㅠ

스크린샷 2024-08-26 19.18.35.png

rbegin() + 3을 하면 {5, 6, 7, 1, 2, 3, 4} 가 나오더라구요...

반시계방향으로 돌려보면 (begin() + 3) {4, 5, 6, 7, 1, 2, 3} 이 나오고요..

v.begin() + 3 => 1부터 오른쪽으로 3칸 이동, 4가 회전지점

v.rbegin() + 3 => 7부터 왼쪽으로 3칸 이동, 4가 회전지점이라 생각했는데, 5가 회전지점인 이유가 궁금합니다.....

 

제가 어느 부분에서 막힌 건지 도와주시면 감사하겠습니다

 

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

v.rbegin() + 3 => 7부터 왼쪽으로 3칸 이동, 4가 회전지점이라 생각했는데, 5가 회전지점인 이유가 궁금합니다.....

>> 회전지점을 중심으로 볼 게 아니라 회전영역을 중심으로 봐주시면 됩니다. ㅎㅎ

#include <bits/stdc++.h>
using namespace std;  
int main(){
    vector<int> v = {1, 2, 3, 4, 5, 6, 7};
    rotate(v.rbegin(), v.rbegin() + 3, v.rend()); 
    for(int i : v) cout << i << ' ';
}  

rotate()는 [first, last) 영역의 요소 중 [first, middel) 을 [middle, last) 뒤에 놓는 함수입니다. 

rotate(v.rbegin(), v.rbegin() + 3, v.rend()); 

여기서 first와 last는 rbegin()과 rend()입니다. 

{1, 2, 3, 4, 5, 6, 7}

이 영역 전부가 됩니다. 

여기서 

[first, middle)은 가 됩니다. 

{1, 2, 3, 4, 5, 6, 7}


자 앞의 영역을 다음의 영역 앞단에 두는 것이죠.

{1, 2, 3, 4, 5, 6, 7}


그렇게 해서 다음과 같은 결과가 되게 됩니다.

{5, 6, 7, 1, 2, 3, 4}


이부분은 교안내에 보강해놓도록 하겠습니다. :)


또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


jjangye96님의 프로필 이미지
jjangye96

작성한 질문수

질문하기