인프런 커뮤니티 질문&답변
arr생성시 공간
작성
·
193
0
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
답변 1
1
배열의 시작은 0 입니다. 1 이 아닙니다.
그래서 만약 new arr[3] 으로 배열을 생성할 경우에 사용가능한 배열의 공간은
arr[0] , arr[1] , arr[2] 으로 총 3개 입니다.
그래서 일반적으로 배열을 생성할 때는 저장할 갯수 + 1로 공간을 잡아줍니다.
아뇨 9개 데이터를 넣는 경우라면 말씀하신대로 int[] arr = new int[9]가 맞습니다.
arr[0] ~ arr[8] 까지, 0,1,2,3,4,5,6,7,8 로 총 9개의 데이터를 저장할 수 있습니다.
네! 이 부분은 이해했습니다. 답변 감사합니다.
그럼 처음 댓글 달아주셨던 부분과는 어떤 차이가 있는지 추가로 여쭤봐도 될까요?
저장할 갯수 +1로 공간을 잡아준다는게 어떤건지 잘 모르겠습니다.
이게 제가 궁금하다고 올린
arr = new int[n+1]을 이해하는데 도움이 될것같습니다.
아 그 부분은 제가 좀 설명을 이상하게 드린 부분이 있었네요
배열의 시작은 0입니다.
그런데 아래 코드의 경우에는 unf[0] 이 아닌 unf[1] 부터 저장을 시도하고 있습니다.
설명감사합니다.
제가 이해하기론
1.
unf = new int[n+1];
for(int i=1; i<=n; i++) unf[i]=i;
이렇게 하거나
2.
unf = new int[n];
for(int i=0; i<n; i++) unf[i]=i+1;
둘 다 가능하다고 이해했는데
2번 방법으로 했을때는 에러가 나서요
에러 내용 : Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9
전체 코드
package ch09;
import java.util.*;
class Edge implements Comparable<Edge>{
public int v1;
public int v2;
public int cost;
Edge(int v1, int v2, int cost) {
this.v1 = v1;
this.v2 = v2;
this.cost = cost;
}
@Override
public int compareTo(Edge e) {
return this.cost - e.cost;
}
}
public class Wonder {
static int[] arrSet;
public static int Find(int v) {
if(v==arrSet[v]) return v;
else return arrSet[v] = Find(arrSet[v]);
}
public static void Union(int a, int b) {
int fa = Find(a);
int fb = Find(b);
if(fa!=fb) arrSet[fa] =fb;
}
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int m = kb.nextInt();
ArrayList<Edge> arr = new ArrayList<>();
arrSet = new int[n];
for(int i=0; i<n; i++) arrSet[i] = i+1;
for(int i=0; i<m; i++) {
int a = kb.nextInt();
int b = kb.nextInt();
int c = kb.nextInt();
arr.add(new Edge(a,b,c));
}
// 출력
int answer = 0;
Collections.sort(arr);
for(Edge ob : arr) {
int fa = Find(ob.v1);
int fb = Find(ob.v2);
if(fa!=fb) {
answer += ob.cost;
Union(ob.v1, ob.v2);
}
}
// return answer 못 할 경우 -> System.out.println(answer);
System.out.println(answer);
}
}
제 생각에는 해당 에러가
unf = new int[n];
for(int i=0; i<n; i++) unf[i]=i +1;
부분에서 나는 것 같진 않네요
만약 배열을 저렇게 생성해줄 경우에는 unf[8] = 9 가 됩니다.
하지만 지금 느낌으로는 배열 원소의 9번째에 접근을 할 때 unf[8] 이 아닌 9를 그대로 넣어서 오류가 발생한 것으로 보여집니다.
그 부분을 코드에서 체크해주신다면 해결하실 수 있으리라 생각됩니다.
일하고 있어서 이제야 코드를 좀 자세히 뜯어보았는데
// 만약 Find(9)로 들어가는 경우
public static int Find(int v) {
if(v==arrSet[v]) return v; // 여기에서 arrSet[9] 조회를 시도 -> ArrayIndexOutOfBound 에러 발생
else return arrSet[v] = Find(arrSet[v]);
}
public static void Union(int a, int b) {
int fa = Find(a);
int fb = Find(b);
if(fa!=fb) arrSet[fa] =fb; // 또는 여기
}오!!!!! 맞습니다!!!!!!
if(v==arrSet[v]) return v; // 여기에서 arrSet[9] 조회를 시도 -> ArrayIndexOutOfBound 에러 발생
arrSet[9] 가 없죠... ㅎㅎㅎㅎㅎㅎ
이걸로 며칠을 신경썼는데,,,,, 도움주셔서 감사합니다!!






안녕하세요 답변 주셔서 감사합니다.
한가지 헷갈리는 부분이 생겨서 답글을 달게 되었습니다.
저는 항상 예를들어 데이터 9개를 넣어야하면
int[] arr = new int[9]
이렇게 생성했는데
"일반적으로 배열을 생성할 때" 그럼
int[] arr = new int[10]
이렇게 선언해야하는 건가요?