2023. 7. 2. 16:29, 알고리즘/BOJ
처음에 함수를 만들때 기존에 전역으로 선언한 배열들을 인자로 받고 싶은데, 복사해서 받는것이 아니라 참조로 받고 싶었는데, 배열에 어떤식으로 &을 붙여야 이걸 복사로 받지 않고 참조로 받는지 몰라서 일단은 boj 2617번 문제를 해결할때 내가 작성한 코드를 확인해보면,
void dfs(int st, int cnt[], vector<int> adj[]){
// cnt[st]++;
vis[st]=true;
for(auto nxt: adj[st]){
if(vis[nxt]) continue;
cnt[nxt]++;
dfs(nxt, cnt, adj);
}
}
이런식으로 만들어서 일단 문제를 해결했다.
그리고 이번 문제와 관련되어서 참고 코드를 확인해보니까 복사하지 않고 참조로 배열을 받는 방법을
bool solve(int st, vector<int> (&adj)[]) { /* <== 바로 여기서 (&adj)[] 형태로 사용*/
fill(vis, vis + n + 1, 0);
queue<int> q;
q.push(st);
vis[st] = 1;
int cnt = 0;
while(!q.empty()) {
int cur = q.front(); q.pop();
for(int nxt : adj[cur]) {
if(vis[nxt]) continue;
q.push(nxt);
vis[nxt] = 1;
cnt++;
}
}
return cnt >= (n + 1)/2;
}
위와 같이 인자로 넣을때, vector<int> (&adj)[] 형태로 작성한 것을 볼 수 있다.
기존에 vector<int> &adj[]로 시도 해보았는데, 이렇게 시도하면,
이와 같은 형태로 에러 메시지를 받게 되는데,
배열을 참조 형식으로 받기 위해서는 이렇듯 (&adj)[] 형태처럼 괄호를 이용하여서 &과 배열의 이름을 같이 묶어주고 난 뒤에 뒤에 [ ] 를 붙여 주어야 한다는걸 이번 풀이를 통해 알게되었다.
다음에도 만약 이런식으로 배열을 받는 함수를 만들고 싶고, 그 함수를 복사가 아니라 참조를 통해서 가져오고 싶으면,
배열의 이름과 &을 함께 괄호() 로 감싸주고, 그 뒤에 [ ] 를 붙여주도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
Comments, Trackbacks