본문 바로가기

Java

Java_05

* 배열 : 동일한 자료형의 다수의 데이터를 저장하고 처리하는 경우 유용하게 사용된다.

- 초기에 방의 갯수를 설정 후 변경할 수 없다. (변경하려면 프로그램을 재작성해야 함)

- 형식
  int month[5]={1, 2, 3, 4, 5};
  정수형으로 5개의 방(length=5)을 가지고 있는 month라는 변수명의 배열을 선언하고 각각의 방의 데이터의 값에
  접근하기 위해서는 해당 값의 인덱스값을 알아야 하는데 다음과 같다.
  month[0], month[1], month[2], month[3], month[4] 으로 0부터 4까지의 5개의 위치정보를 명시하는
  인덱스값이 있다.
  month[]={1, 2, 3, 4, 5}; 식으로 배열의 길이를 표시하지 않아도 자동으로 그 길이를 인식한다.

- 예제: 만년 달력 만들기
  2월의 날수 29일 조건 : 년도가 4의 배수이고 100의 배수가 아니거나 400의 배수
  · 1월:31,  2월:28,  3월:31,  4월:30,  5월:31,  6월:30,  7월:31,  8월:31,  9월:30, 10월:31, 11월:30, 12월:31
    y%4==0&&y%100!=0||y%400==0   



- Selection Sort

배열의 값 중 가장 작은 값을 찾아 i[0] 번째의 값과 위치를 바꾸고
i[0]번째의 값을 제외한 나머지 값들 중 가장 작은 값을 찾아 i[1]번째 값과 위치를 바꾸고..
i[0]번째와 i[1]번째 값을 제외한 나머지 값들 중 가장 작은 값을 찾아 i[2]번째 값과 위치를 바꾸고..
반복하여 오름차순 정렬이 되록 i[n]일때 n개의 값에 각각 n-1번 비교 한다.

→왼쪽부터 오름차순으로 정렬

 


예제)

  1. public class Test3{
  2.     public static void main(String[] agrs){
  3.         int a[]{56,85,75,10,52};
  4.  
  5.         System.out.print("Source Date : ");
  6.         for(int i=0; i<a.length; i++)
  7.             System.out.print(a[i]+" ");
  8.         System.out.println();
  9.  
  10.         // Selection Sort
  11.         int temp;
  12.         for (int i=0; i<a.length-1; i++){
  13.             for (int j=i+1; j<a.length; j++){
  14.                 if(a[i]>a[j]){ // 오름차순(swap): 부등호만 바꾸면 내림차순
  15.                     temp=a[i];
  16.                     a[i]=a[j];
  17.                     a[j]=temp;
  18.                 }
  19.             }
  20.         }
  21.         System.out.print("Sort Data : ");
  22.         // 향상된 for문
  23.         for (int n : a){ // for(자료형 접근변수: 배열이나 컬렉션 변수)
  24.             System.out.print(n + " ");
  25.         }
  26.         System.out.println();
  27.     }
  28. }


- Bubble Sort
인접한 두 값을 비교하여 정렬


→오른쪽부터 오름차순 정렬

△ 이미지 출처: http://en.wikipedia.org/wiki/Bubble_sort


예제)
  1. public class Test4{
  2.     public static void main(String[] args){
  3.    
  4.     int a[]={56, 85, 75, 18, 52};
  5.     System.out.print("Source Data : ");
  6.     for(int n : a){
  7.         System.out.print(n+" ");
  8.     }
  9.     System.out.println();
  10.  
  11.     java.util.Arrays.sort(a); // sort 한줄;;
  12.  
  13.     System.out.print("Sort Data : ");
  14.     for(int n : a){
  15.         System.out.print(n+" ");
  16.     }
  17.     // Bubble sort 시작
  18.     boolean flag;
  19.     int pass=1, temp;
  20.  
  21.     do{
  22.         flag=false;
  23.         for (int i=0; i<a.length-pass; i++){
  24.             if(a[i]>a[i+1]){
  25.                 temp=a[i];
  26.                 a[i]=a[i+1];
  27.                 a[i+1]=temp;
  28.                 flag=true;
  29.             }
  30.         }
  31.         pass++;
  32.     }while (flag);
  33.     // Bubble sort 끝
  34.     System.out.print(" Sort Data : ");
  35.     for(int n : a){
  36.         System.out.print(n + " ");
  37.     }
  38.     System.out.println();
  39.     }
  40. }


- 2차원 배열
1차원 배열과 의미는 같으나 i[행][열] 형태로 열의 방만 있는 것이 아닌 행도 존재 한다.

- 행열의 합 구하기



위의 형태를 소스로 풀어보면.... class 선언 생략)

int a[][] = {{5,4,1},{6,3,3},{5,2,4}};
int b[][] = {{8,4,3},{7,7,8},{5,7,2}};
int c[][] = new int[3][3];

// 2차원 행렬의 합 구하기
for(int i=0; i<a.length; i++){ // 행의 수 a.length
    for(int j=0; j<a[i].length;j++){ // 열의 수 a[i].length
        c[i][j]=a[i][j]+b[i][j];
    }
}
// 출력a
System.out.println("a 행렬..");
for(int i=0; i<a.length; i++){
    for(int j=0; j<a[i].length; j++){
        System.out.printf("%4d", a[i][j]);
    }
    System.out.println();
}
// 출력b
System.out.println("b 행렬..");
for(int i=0; i<b.length; i++){
    for(int j=0; j<b[i].length; j++){
        System.out.printf("%4d", b[i][j]);
    }
    System.out.println();
}
// 출력c
System.out.println("c행렬합..");
for(int i=0; i<c.length; i++){
    for(int j=0; j<c[i].length; j++){
        System.out.printf("%4d", c[i][j]);
    }
    System.out.println();


- 행렬의 곱 구하기


위의 형태를 소스로 풀어보면.... class 선언 생략)

int a[][] = {{5,4,1},{6,3,3},{5,2,4}};
int b[][] = {{8,4,3},{7,7,8},{5,7,2}};
int c[][] = new int[3][3];

// 행렬의 곱구하기
int d[][]=new int[3][3];
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            for(int k=0; k<3; k++) {
                d[i][j] += a[i][k]*b[k][j];
            }
        }
    }   
// 행렬의 곱
System.out.println("행렬곱..");
for(int i=0; i<d.length; i++){
    for(int n : d[i]){
        System.out.printf("%4d",n);
    }
    System.out.println();


- 결과



* 향상된 for문
상단에 sort(정렬)관련 예제에 소스는 적혀 있지만 잘 이해가 안가서 밑에서 다시 정리

int a[] = {56,85,75,10,52}; 이라는 배열을 선언하고 반복문을 돌리자 하면

for (int i=0; i<a.length; i++){
    int n = a[i];
}System.out.print (n + " ");

위와 같이 작성해야 하겠지만
아래처럼 간단? 하게 작성 가능하다는 것 같은데

for (int n : a){
    System.out.print (n + " "); 
}

위의 소스를 풀어보면
int n은 배열에 들어있는 한개의 값을 저장해 둘 수 있는 정수형 변수를 선언한 것이고
for문이 반복될 때마다 n에 a라는 배열안의 데이터가 모두 소진 될때까지 반복된다? 라는 것 같다.
참고로 int n 의 변수 선언은 for문의 바깥으로 빠질 수 없다.
: 은 오른쪽 배열의 데이터가 왼쪽 변수에 대입된다라는 것이고
a 는 위에서 설명했듯 배열의 이름이다... 아! 정리해보니 쉽네? =ㅅ=;;


* Array.sort()
Bubble sort의 소스를 풀어놓은 상단의 예제의 11번 줄에 
java.util.Arrays.sort(a) 라는 아주 간단하다 싶은 한줄의 소스로
boolean 어쩌구 do while안에 얽혀 있는 for와 if의 만찬을 엎어버린 꼴이다 싶다.

Arrays는 자동으로 정렬을 도와주는 API라고 불리우는 라이브러리 같은 존재라 하는데
깊은 이해도로써의 정리를 하고 싶어 구글링을 해봤지만 도통 아직은(?) 이해할 수 없는 말들 뿐;;
그저 자동으로 정렬을 도와주는 아주 고마운 친구라는 것 정도로 정리하고 말아야하나...


* 명령행 인수
명령프롬포트 창에서 java Test8 AA BB CC 라고 입력시 입력된 문자열이
args[0] = AA 
args[1] = BB
args[2] = CC 
이렇게 저장이 된다는 것 같은데 왜 필요한건지 어떻게 쓰이는지에 대해선
솔직히 잘 모르겠다..-.-a





문제1) 년, 월, 일을 입력 받아 요일 구하기
(솔직히 위에 만년달력 문제부터 잘 이해가 안감..)


문제2) 다음과 같이 출력하는 프로그램 작성
A B C D E
J  I  H H F
K L M N O
T S R Q P
U V W X Y
(아스키코드를 for문을 이용하여 지그재그 형태로 반복되도록...이라지만
보고 또봐도 다시 해보려하면 안되니 그냥 외워야 하나)













'Java' 카테고리의 다른 글

Java_07  (0) 2011.11.01
Java_06  (0) 2011.10.31
Java_04  (0) 2011.10.27
Java_03  (0) 2011.10.26
Java_02  (0) 2011.10.25