강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

루돌프친구님의 프로필 이미지
루돌프친구

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

7. 원더랜드(최소 스패닝 트리 - 크루스칼 : Uion&Find 이용)

arr생성시 공간

작성

·

193

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
코드 중에
class Main {
static int[] unf;
 
public static void main(String[] args) {
....
unf = new int[n+1];
for(int i=1; i<=n;i++) unf[i] =i;
 
....
}
 
}
 
 
위 코드에서 unf = new int[n+1]; 이부분을
저는 unf = new int[n];으로 구현 해서 에러가 났습니다.
 
(집합번호를 1~n까지 초기화하니까,
for(int i=1; i<=n;i++) unf[i] =i;
이런 코드를 구현한 것은 이해했습니다. )
 
만약 unf = new int[n+1];으로 공간을 할당한다면
입력은 예를들어 9를 했는데 공간은 10이 생겨버리는게 아닌가요?
 
 
 
 
 
 
 
 
}

답변 1

1

배열의 시작은 0 입니다. 1 이 아닙니다. 

그래서 만약 new arr[3] 으로 배열을 생성할 경우에 사용가능한 배열의 공간은

 

arr[0] , arr[1] , arr[2] 으로 총 3개 입니다. 

 

그래서 일반적으로 배열을 생성할 때는 저장할 갯수 + 1로 공간을 잡아줍니다. 

안녕하세요 답변 주셔서 감사합니다. 

한가지 헷갈리는 부분이 생겨서 답글을 달게 되었습니다. 

 

저는 항상 예를들어 데이터 9개를 넣어야하면

int[] arr = new int[9]

이렇게 생성했는데 

 

"일반적으로 배열을 생성할 때" 그럼

int[] arr = new int[10]

 

이렇게 선언해야하는 건가요? 

 

 

아뇨 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] 부터 저장을 시도하고 있습니다. 

unf = new int[n+1];
for(int i=1; i<=n;i++) unf[i] =i;
 
 
이러한 경우에는 n+1 로 배열을 생성해주셔야 정상적으로 저장이 가능합니다.
만약
for(int i=0 ; i < n ; i++) unf[i] = i+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] 가 없죠... ㅎㅎㅎㅎㅎㅎ

 

이걸로 며칠을 신경썼는데,,,,, 도움주셔서 감사합니다!!

 

루돌프친구님의 프로필 이미지
루돌프친구

작성한 질문수

질문하기