자료구조&기본 알고리즘 입문(자바)- 배열(2)
○난수를 사용해 배열의 요솟값 설정하기
배열의 요소에 값을 하나하나씩 입력하기 어려울 경우, 각 요소에 난수를 대입하면 된다.
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 클래스의 인스턴스는 일련의 난수를 생성.
난수를 생성하는 단계는 다음과 같다
- Random 클래스를 간단한 이름으로 사용하기 위해 형 import 선언
- Random 클래스형의 변수(이 프로그램에서는 rand)를 만들기 위한 선언
- 변수 rand에 대한 난수를 생성하는 메서드 nextInt를 호출
○배열 요소를 역순으로 정렬하기
요소 개수가 n인 배열 요소를 역순으로 정렬하는 알고리즘을 간단히 나타내면 다음과 같다
for(i=0;i<n/2;i++)
// a[i]와 a[n-i-1]의 값을 교환
○두 값의 교환
배열의 역순 정렬은 요소 교환이 총 n/2회 필요하다. 두 값의 교환은 교환을 위해 같은 자료형을 가진
변수(t)를 하나 더 사용한다. 교환 과정은 다음과 같다.
- x값을 t에 보관
- y 값을 x에 대입
- 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