inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

[필수개념] 조합(combination)

1차원 배열 회전 관련 질문

138

jjangye96

작성한 질문수 3

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 가 나오더라구요 ..

 

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

c++ 코딩-테스트

답변 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

안녕하세요!

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

스크린샷 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가 회전지점인 이유가 궁금합니다.....

 

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

 

1

큰돌

안녕하세요 ㅎㅎ

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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

45

2

2주차 개념#12 트리 순회

0

24

2

백준사이트가 종료된다고 합니다.

0

270

2

백준 서비스 종료

9

856

1

sk 하이닉스 코테 대비

0

366

2

3-G 최댓값 질문

0

50

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

82

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

102

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

169

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

51

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

67

2

함수별 시간복잡도

0

72

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

53

2

1-I 문제 질문 드립니다.

0

76

2

2-P 질문입니다.

0

56

1

mac에서 시작하기 관련

0

91

2

5-Q 질문

0

63

2

풀이 코드 질문

0

64

2