1차원 배열 회전 관련 질문
138
작성한 질문수 3
안녕하세요
알고리즘 교안 > 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번째 까지만 돌리는 것이죠.

[는 포함한다.
)는 포함하지 않는다는 기호입니다.
반시계방향 문제는 제가 이해한 방식으로 여러 다른 문제 풀어도 결과가 동일하게 나오는데
>>
{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
안녕하세요!
답변 감사히 잘 읽어봤지만, 제가 궁금한 지점이 아직 해결되지 않아서 다시 질문드립니다 ㅠㅠ

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





