해결된 질문
작성
·
55
·
수정됨
0
#include <bits/stdc++.h>
using namespace std;
const int n = 3;
const int m = 4;
void rotate_left_90(vector<vector<int>> &key){
int n = key.size();
int m = key[0].size();
vector<vector<int>> temp(m, vector<int>(n,0));
for(int i = 0; i<m; i++){
for(int j = 0; j<n; j++){
temp[i][j] = key[j][m-i-1];
}
}
//key.resize(m); -> @@@@@@@
//key[0].resize(n); -> @@@@@@
key = temp;
return;
}
int main(){
vector<vector<int>> a = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
rotate_left_90(a);
for(int i = 0; i<m; i++){
for(int j = 0; j < n; j++){
cout << a[i][j] << " ";
}
cout << '\n';
}
return 0;
}
안녕하세요 큰돌님 덕분에 코테준비에 힘을 얻는중입니다. 다름이 아니라 c++교안을 쭉 정독하며 이해하려 하고 있는중에, 의문점이 생겨 질문드립니다.
위 코드는 교안에 있는 rotate_left_90()을 적용한 코드입니다.
첫번째는, key.resize()에 대한 의문입니다. 구글링을 해보니 벡터는 '='로 대입하면 깊은복사가 일어난다고 합니다... 주석으로 없애고 실행해도... 깊은복사가 일어나는 것 같습니다... 그렇다면 지금 매개변수를 &key로 참조에 의한 호출로 받아 메인함수 벡터 a의 값을 변경중인데, 깊은복사가 일어나면 아예 새로운 벡터를 할당하는 것이니 형식만 맞다면 사이즈 조정을 할 필요 없지 않나요? 실제로 주석을 달아서 실행해도 값이 같게 나와서 사이즈 조정의 필요성과 제 지식이 맞는지 헷갈려 질문드립니다.
두번째는, key[0].resize(n) 부분입니다. 사이즈 조정이 필요한 상황이라고 한다면 해당 코드는 key의 첫번째요소(벡터)만 사이즈 초기화를 해주고 있는 상황이 아닌가요?? 이렇게 된다면 나머지 요소(벡터)에 해당하는 길이들은 초기화 되지 않는게 아닌가요?? 출력에는 문제가 없어서... 저렇게 첫번째 요소의 길이만 수정해도 나머지 요소(벡터)들의 길이도 수정되는건지 궁금합니다 -> 아 이 부분은 해결했습니다...! 첫번째 요소가 벡터의 높이가 되는 느낌인거군요...?
답변 1
0
안녕하세요 ㅎㅎ
첫번째는, key.resize()에 대한 의문입니다.
-> 네 맞습니다. 예리하시네요 ㅎㅎ 해당 부분 오늘내로 교안 내에 반영하도록 하겠습니다. resize는 필요없습니다.
감사합니다.
key[0].resize(n)를 보면, 첫번째 요소의 벡터 길이만 n으로 초기화 하면! 전체 열들의 길이가 n으로 초기화 되는게 아니라, 첫번째 요소 벡터의 길이만 초기화되는거 같은데
-> 네 맞습니다. ㅎㅎ 저거는 잘못된 코드네요. 해당부분은 반복문을 사용해서 다음과 같이 수정되어야 합니다. (만약 resize를 사용할 거면)
key.resize(m);
for (int i = 0; i < m; i++) {
key[i].resize(n);
}
혼란을 드려 죄송합니다.
감사합니다.
감사합니다. 뭔가 뿌듯하네요.
다름이 아니라 2번 문제도 확 와닿지가 않아 질문드립니다...! 위의 주석처럼
key[0].resize(n)를 보면, 첫번째 요소의 벡터 길이만 n으로 초기화 하면! 전체 열들의 길이가 n으로 초기화 되는게 아니라, 첫번째 요소 벡터의 길이만 초기화되는거 같은데,,, 전체 요소의 길이를 n으로 초기화한걸 의도하신게 아닐까요...? resize()할 때 key[0].resize(n)만 resize() 해주신 이유가 너무 궁금합니다.