개발/Java

자료구조&기본 알고리즘 입문(자바)- 배열(2)

inkor 2021. 12. 26. 16:11

○난수를 사용해 배열의 요솟값 설정하기 

배열의 요소에 값을 하나하나씩 입력하기 어려울 경우, 각 요소에 난수를 대입하면 된다.

import java.util.Random;
import java.util.Scanner;
// 배열 요소의 최댓값을 나타냄(값을 난수로 생성).

class MaxOfArrayRand {
	// 배열 a의 최댓값을 구하여 반환.
	static int maxOf(int[] a) {
		int max = a[0];
		for (int i = 1; i < a.length; i++)
			if (a[i] > max)
				max = a[i];
		return max;
	}

	public static void main(String[] args) {
		Random rand = new Random();
		Scanner stdIn = new Scanner(System.in);

		System.out.println("키의 최댓값을 구하기.");
		System.out.print("사람 수 : ");
		int num = stdIn.nextInt();				// 배열의 요솟수를 입력 받음

		int[] height = new int[num];			// 요솟수가 num인 배열을 생성

		System.out.println("키 값은 아래와 같습니다.");
		for (int i = 0; i < num; i++) {
			height[i] = 100 + rand.nextInt(90);		// 요소의 값을 난수로 결정
			System.out.println("height[" + i + "]:" + height[i]);
		}

		System.out.println("최댓값은 " + maxOf(height));
	}
}

난수를 생성할 떄 java.util 패키지의 Random 클래스를 사용. java.util 패키지에 속한 Random 클래스는 Java가 제공하는 라이브러리. Random 클래스의 인스턴스는 일련의 난수를 생성. 
난수를 생성하는 단계는 다음과 같다

  1. Random 클래스를 간단한 이름으로 사용하기 위해 형 import 선언
  2. Random 클래스형의 변수(이 프로그램에서는 rand)를 만들기 위한 선언
  3. 변수 rand에 대한 난수를 생성하는 메서드 nextInt를 호출 

○배열 요소를 역순으로 정렬하기
요소 개수가 n인 배열 요소를 역순으로 정렬하는 알고리즘을 간단히 나타내면 다음과 같다

for(i=0;i<n/2;i++)
	// a[i]와 a[n-i-1]의 값을 교환

 

○두 값의 교환
배열의 역순 정렬은 요소 교환이 총 n/2회 필요하다. 두 값의 교환은 교환을 위해 같은 자료형을 가진
변수(t)를 하나 더 사용한다. 교환 과정은 다음과 같다.

  1. x값을 t에 보관
  2. y 값을 x에 대입
  3. t에 보관한 처음 x 값을 y에 대입

x->t / y->x / t->y

배열 요소를 역순으로 정렬하는 과정에서 교환하는 값은 x와 y가 아니라 배열 안의 두 요소의 값이라, 
교환요소가 a[idx1], a[idx2]라면 값의 교환은 다음과 같이 할 수 있다.

t = a[idx1]
a[idx1] = a[idx2];
a[idx2] = t;

// 배열 요소 a[idx1]과 a[idx2]의 값을 교환
static void swap(int[] a, int idx1, int idx2) {
 int t = a[idx1]; a[idx1] = a[idx2] = t;             //a[idx1]과 a[idx2]의 값을 교환
}
import java.util.Scanner;
// 배열 요소에 값을 읽어 들여 역순으로 정렬.

class ReverseArray {
	// 배열 요소 a[idx1]과 a[idx2]의 값을 바꿈
	static void swap(int[] a, int idx1, int idx2) {
		int t = a[idx1];  a[idx1] = a[idx2];  a[idx2] = t;
	}

	// 배열 a의 요소를 역순으로 정렬
	static void reverse(int[] a) {
		for (int i = 0; i < a.length / 2; i++)
			swap(a, i, a.length - i - 1);
	}

	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);

		System.out.print("요솟수 :");
		int num = stdIn.nextInt();		// 요솟수

		int[] x = new int[num];			// 요솟수가 num인 배열

		for (int i = 0; i < num; i++) {
			System.out.print("x[" + i + "] : ");
			x[i] = stdIn.nextInt();
		}

		reverse(x);		// 배열 a의 요소를 역순으로 정렬

		System.out.println("요소를 역순으로 정렬한 결과.");
		for (int i = 0; i < num; i++)
			System.out.println("x[" + i + "] = " + x[i]);
	}
}

 

○두 배열의 비교

import java.util.Scanner;	
// 두 배열이 같은가를 판단

class ArrayEqual {
	// 두 배열 a, b의 모든 요소가 같은가?
	static boolean equals(int[] a, int[] b) {
		if (a.length != b.length)
			return false;

		for (int i = 0; i < a.length; i++)
			if (a[i] != b[i])
				return false;

		return true;
	}

	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);

		System.out.print("배열 a의 요솟수:");
		int na = stdIn.nextInt();		// 배열 a의 요솟수

		int[] a = new int[na];			// 요솟수가 na인 배열

		for (int i = 0; i < na; i++) {
			System.out.print("a[" + i + "] : ");
			a[i] = stdIn.nextInt();
		}

		System.out.print("배열 b의 요솟수:");
		int nb = stdIn.nextInt();		// 배열 b의 요솟수

		int[] b = new int[nb];			// 요솟수가 nb인 배열

		for (int i = 0; i < nb; i++) {
			System.out.print("b[" + i + "] : ");
			b[i] = stdIn.nextInt();
		}

		System.out.println("배열 a와 b는 " + (equals(a, b) ? "같다.": "같지 않다."));
	}
}

메서드 equals는 두 배열 a와 b의 모든 요소가 같은가를 판단, 반환형(Type)은 boolean형으로
모든 요소의 값이 같으면 true를, 그렇지 않으면 false를 반환
판단은 다음과 같이 세 단계로 수행

if(a.length!=b.length)
	return false;

1. 두 배열 a,b 의 요솟수)길이를 비교. 요솟수가 다르면 배열이 같지 않은 것이기에 false를 반환 

for (int i = 0; i < a.length; i++)
	if (a[i] != b[i])
	 return false;

2.  이 for 문에서는 두 배열을 초음부터 스캔하면서  요소a[i]와 b[i]의 값을 비교하는 것을 반복. 
그 과정에서 값이 다른 요소를 발견하면 반환문을 실행하여 false를 반환

return true;

3. 프로그램의 흐림이 여기에 도달하면 for문이 중단되지 않고 끝까지 실행된 경우. 두 배열은 같다라고
판단할 수 있으므로 true를 반환

 

-출처: 자료구조와 함꼐 배우는 알고리즘 입문[자바편] 책 중
http://www.yes24.com/Product/Goods/60547893