국비학원 교육 일지

[5일차] 국비교육

snooop 2022. 7. 25. 17:47

1.배열 

1)배열이란?

  • 자바에서 인덱스는 언제나 0부터 시작, 
  • 1차원 배열, 2차원 배열 등 다차원 배열로도 선언(주로 1,2차원 많이 사용)
  • 연속데이터 처리 시 필요, 배열보다 Arraylist많이 사용
  • 타입[] 배열이름 = new 타입[배열길이];
  • int[] arr = new int[4];

 

   배열 예제))

package ArrayEx1;

public class ArrayEx1 {
    public static void main(String[] args){
        int[] score = new int[3]; // score 이름으로 3개의 정수 타입 배열을 생성
        score[0] = 88;
        score[1] = 70;
        score[2] = 66;
        //메모리 확보 후 선언
        for(int i = 0; i < score.length; i++) {
            System.out.print(score[i] + " " );
             //length는 3이므로 0,1,2를 돌고 있음
        }

    }
}

 


 

package ArrayEx1;

public class ArrayEx1 {
    public static void main(String[] args){
        int[] score = {89, 99,100, 77}; // score 이름으로 3개의 정수 타입 배열을 생성
        //선언과 동시에 값을 넣어줌 
        for(int i = 0; i < score.length; i++) {
            System.out.print(score[i] + " " );
            
        }

    }
}

 

package ArrayEx1;

public class ArrayEx1 {
    public static void main(String[] args){
        int[] score = {89, 99,100, 77};
        
        int sum = 0;
        for(int i = 0; i < score.length; i++) {
            System.out.print(score[i] + " " );
         sum += score[i];
        }
        System.out.println();
        System.out.println("총점 : " + sum);

    }
}
package ArrayEx1;

public class ArrayEx1 {
    public static void main(String[] args){
        int[] score = {89, 99,100, 77};

        int sum = 0;
        /*for(int i = 0; i < score.length; i++) {
            System.out.print(score[i] + " " );
         sum += score[i]; // sum = sum + score[i]
        }*/
        //향상된 for 문 : 자동으로 요소의 무조건 처음부터 끝까지 순회(원하는 위치부터 순회 불가)
        //순서를 바꿀 수 없다
        for(int e : score){
            e += 100;
            System.out.print(e + " ");
            sum += e;
            //score 에는 제한된 변수에 한해서 사용 가능 함
        } //향상된 for 문에서는 배열값이 바뀐 상태로 있어야 하지만 실제 값은 변경 되어 있지 않음 
        for(int e : score){
            System.out.print(e + " ");
            sum += e;
        }
        System.out.println();
        System.out.println("총점 : " + sum);

    }
}
package ArrayEx1;

public class ArrayEx1 {
    public static void main(String[] args){
        int[] score = {89, 99,100, 77};

        int sum = 0;
        for(int e : score) sum += e;
        System.out.println(Arrays.toString(score));
        //배열의 요소를 출력
        System.out.println("총점 : " +  sum);
        System.out.printf("평균 : %.2f\n", (double)sum/score.length);

    }
}

 


1.2)배열의 선언

 

package ArrayEx1;
//배열의 다양한 초기화 방법
public class ArrayEx1 {
    public static void main(String[] args){
        int[] score1 = {88, 99, 56};
        //배열의 초기값이 정해져 있는 경우는 new 키워드를 메모리 할당할 필요가 없음
        int[] score2 = new int[] {77, 78,88};
        //2번째 방법 잘 사용하지 않음,,,
        int[] score3;
        score3 = new int[] {44, 55, 66};
        int[] score4 = new int[3];
        score4[0] = 22;
        score4[1] = 88;
        score4[2] = 78;
        //score1, score4 가장 많이 사용하는 듯 함
    }
}

 

package ArrayEx1;

import java.util.Arrays;

//배열의 다양한 초기화 방법
//다양한 데이터 타입에 대한 배열 선언
public class ArrayEx1 {


    public static void main(String[] args) {

        String[] weeks = new String[7];
        //배열 무조건 개수 정하지만 바꿀 수 있음(하지만, 수정이 어려움)
        weeks[0] = "월요일";
        weeks[1] = "화요일";
        weeks[2] = "수요일";
        weeks[3] = "목요일";
        weeks[4] = "금요일";
        weeks[5] = "토요일";
        weeks[6] = "일요일";
        System.out.print("[");
        for(int i = 0; i < weeks.length; i++){
            System.out.print(weeks[i] + ", ");
        }
        System.out.printf("\b\b]");//일요일 뒤에 , 없앰
        System.out.println();

        System.out.println(Arrays.toString(weeks));
        //배열 클래스의 메소드를 이용해서 출력

        System.out.print("[");
        for(String e : weeks) System.out.print(e + ", ");
        System.out.print("\b\b]");
        System.out.println();
    }
}

배열 연습문제1)))

package 배열연습문제1;

import java.util.Scanner;

//10개의 정수 배열을 생성, 값이 중복 됨(1,2,3,4,5,1,2,3,4,5)
//이중에서 찾을 값 입력 : 2 ===> 결과는 7이 나와야 함
//해당 값의 위치(인덱스에+1)를 반환하고 두번째 값이 없으면 -1을 반환
public class ArrayEx1 {
    public static void main(String[] args) {
        //정수형 배열 선언
        //찾을 값을 입력 받기 위한 변수생성 및 스캐너 객체 생성
        int cnt = 0; //찾을 값이 몇번 나타났는지 확인하기 위한 변수
        int[] arr = {1, 2, 3, 4, 5, 1, 2, 3, 4, 4};
        Scanner sc = new Scanner(System.in);
        System.out.print("찾을 값 입력 : ");
        int n = sc.nextInt();
        //반복문을 순회하면서 해당값의 위치를 찾음
        //첫번째 찾은 값이 아니고 두번째 위치를 찾아야 됨
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == n) {
                cnt++;
                if(cnt ==2){
                    System.out.println(i + 1);
                    break;//더이상 찾을 필요가 없으니 break
                    
                }
              
            }
        }
        if(cnt < 2 ) System.out.println("-1");
        //두번재 값이 없으면 -1을 반환하므로
    }
}

 

배열 연습문제2)))

문제

상현이가 가르치는 아이폰 앱 개발 수업의 수강생은 원섭, 세희, 상근, 숭, 강수이다.

어제 이 수업의 기말고사가 있었고, 상현이는 지금 학생들의 기말고사 시험지를 채점하고 있다. 기말고사 점수가 40점 이상인 학생들은 그 점수 그대로 자신의 성적이 된다. 하지만, 40점 미만인 학생들은 보충학습을 듣는 조건을 수락하면 40점을 받게 된다. 보충학습은 거부할 수 없기 때문에, 40점 미만인 학생들은 항상 40점을 받게 된다.

학생 5명의 점수가 주어졌을 때, 평균 점수를 구하는 프로그램을 작성하시오.

입력

입력은 총 5줄로 이루어져 있고, 원섭이의 점수, 세희의 점수, 상근이의 점수, 숭이의 점수, 강수의 점수가 순서대로 주어진다.

점수는 모두 0점 이상, 100점 이하인 5의 배수이다. 따라서, 평균 점수는 항상 정수이다.

출력

첫째 줄에 학생 5명의 평균 점수를 출력한다.

 

public class ArrayEx2 {
    public static void main(String args[]){

        //5명의 성적을 입력 받기 위한 배열 선언
        //선언된 배열에 5명의 성적을 받기 위해서 스캐너 생성
        //총점을 누적하기 위한 변수 선언
        //반복문을 통해서 5명의 성적을 배열에 입력 받음
        //입력받은 배열에서 40보다 작은 요소 값을 찾아서 40으로 변경 해줌
        //변경된 성적으로 총점을 구하고 학생수로 나누어 평균을 구함


        int[] score = new int[5];
        int total = 0;
        Scanner sc = new Scanner(System.in);

        System.out.print("성적 입력 : ");
        for(int i = 0;i < score.length; i++){
            score[i] = sc.nextInt();

            if(score[i] < 40)
              score[i] = 40;
              //성적이 40점이하인 경우 40으로 조정

                total += score[i]; //score[0 ~ 4]까지의 성적을 total에 누적

            }

            System.out.print(total/score.length);
        }


    }

 

 

배열예제3)))

 

상근날드에서 가장 잘 팔리는 메뉴는 세트 메뉴이다. 주문할 때, 자신이 원하는 햄버거와 음료를 하나씩 골라, 세트로 구매하면, 가격의 합계에서 50원을 뺀 가격이 세트 메뉴의 가격이 된다.

햄버거는 총 3종류 상덕버거, 중덕버거, 하덕버거가 있고, 음료는 콜라와 사이다 두 종류가 있다.

햄버거와 음료의 가격이 주어졌을 때, 가장 싼 세트 메뉴의 가격을 출력하는 프로그램을 작성하시오.

입력

입력은 총 다섯 줄이다. 첫째 줄에는 상덕버거, 둘째 줄에는 중덕버거, 셋째 줄에는 하덕버거의 가격이 주어진다. 넷째 줄에는 콜라의 가격, 다섯째 줄에는 사이다의 가격이 주어진다. 모든 가격은 100원 이상, 2000원 이하이다.

출력

첫째 줄에 가장 싼 세트 메뉴의 가격을 출력한다.

예제 입력 1

800
700
900
198
330

예제 출력 1

848

 

 

package 배열연습문제3;
//햄버거 3개, 음료 2개를 배열로 입력 받음(햄버거 0,1,2 배열, 음료는 3,4 배열)
//배열의 0~2까지에서 제일 작은값 골라내기
//배열 인덱스 3번의 값과 4번의 값 중에서 작은 값 선택
//세트 메뉴 가격 = 햄버거 + 음료 - 50
import java.util.Scanner;

public class ArrayEx3 {
    // 햄버거와 음료를 입력 받기 위한 배열 선언 (총 5개)


    public static void main(String[] args){
        // 햄버거와 음료에 대한 가격을 입력 받기 위한 스캐너 생성
        Scanner sc = new Scanner(System.in);
        System.out.print("메뉴 입력 : ");
        int[] arr = new int[5];
        // 반복문과 스캐너를 이용해서 배열에 햄버거와 가격 입력 받음
        for(int i = 0; i < arr.length; i++){
            arr[i] = sc.nextInt();
        }

        // 제일 싼 햄버거를 선택하기 위한 변수를 생성하고, 배열의 0번 인덱스의 값을 넣어줌
           int minBurger = arr[0];
        // 제일 싼 음료를 선택하기 위한 변수를 생성하고, 배열의 3번 인덱스의 값을 넣어줌
           int minDrink =  arr[3];

           for (int i = 0; i < arr.length;i++){
               if((i < 3) && (minBurger > arr[i])) minBurger = arr[i];
               if ((i > 2) && (minDrink  > arr[i])) minDrink = arr[i];
           }
        // 출력 : (햄버거 변수 + 음료 변수 - 50)
        System.out.println(minBurger + minDrink -50);

           //내가 푼 풀이
          /*  int s = Math.min(arr[0],arr[1] );
            int j = Math.min(arr[0],arr[2]);
            int k = Math.min(arr[3],arr[4]);
            if(s>j){
                System.out.print("가격 : " + (j+k-50));
            }else{
                System.out.print("가격 : " + (s+k-50));

            }*/


    }
}

 

 

 

 

import java.util.Arrays;

// 로또 번호 자동 생성
public class LottoEx1 {
    public static void main(String[] args){
        int[] lotto = new int[6];
        int tmp;//랜덤으로 생성된 번호를 임시 저장
        boolean isExist = false;//다른 값이면 저장 
        int index = 0;//중복된 번호가 없는 경우 0부터 채워 나감
        /*for(int i = 0; i < lotto.length; i++){
            lotto[i] = (int)((Math.random() * 45) + 1);
        }*///최종값이 정해져있음(횟수가 정해져있으면 for문)
        while (true) {
            tmp = (int)((Math.random() * 45) + 1);
            //실수로 표현되어 정수형으로 강제 형변환되므로 
            // 소수점을 뺄경우 44경우 45를 얻기 위해 +1을 해줌
            for(int i = 0; i < lotto.length; i++){
                if(lotto[i] == tmp) isExist = true;
            }//중복 값이 있는가?
            if(!isExist) lotto[index++] = tmp; 
            //현재 생성된 번호가 배열내에 없으면 배열에 추가
            if(index == 6) break;
            isExist = false;
        }
       System.out.println(Arrays.toString(lotto));
    }
}

1.3)배열의 정렬

 

  • 퀵정렬 제일 빠름
  • 버블정렬, 선택정렬 - 패턴 구분, 구현 알고 있으면 좋음
  1. 버블정렬
package 버블정렬;
//버블 정렬은 배열의 각 요소를 현재위치와 다음위치의 요소를 각각을 다 비교
//인접하는 것끼리 비교
import java.util.Arrays;

public class BubbleEx1 {
    public static void main(String[] args){
        int[] arr = {9,4,3,10,50,8,77,6,23,1};
        int tmp;
        for(int i = 0; i < arr.length; i++){
            for(int j = i; j < arr.length; j++){
                if(arr[i] > arr[j]){
                    tmp= arr[j];
                    arr[j] = arr[i];
                    arr[i] = tmp;
                }//i=0일때 j의 for 문을 다 돌아야 i=1로 감
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

*오름차순 정렬 됨 ---> 내림차순 if(arr[i] < arr[j]) 바꾸면 됨

 

2. 선택정렬

 

package 선택정렬;
//배열에 제일 값은 값에 위치를 찾고 그것과 위치를 바꿈
import java.util.Arrays;

public class SelectionEx1 {
    public static void main(String[] args){
        int[] arr = {9,4,3,10,5,8,7,6,2,1};
        int tmp = 0; //값을 정렬 할 때 임시로 사용되는 변수
        int min; //제일 작은 값이 있는 위치에 대한 인덱스
        for(int i = 0; i < arr.length; i++){
            min = i;
            for(int j = i; j < arr.length; j++){
                if(arr[j] < arr[min]){
                    min = j;//제일 작은 값에 위치만 가지고 있음
                }
            }
            tmp = arr[i];
            arr[i] = arr[min];
            arr[min] = tmp;
        }
        System.out.println(Arrays.toString(arr));
    }
}

정렬 : 지금은 이해하지 못해도 되지만 면접 시 알고 있으면 유리함

 

1.4) 2차원 배열

 

package 배열2차원;
// 2차원 배열 : 행과 열이 존재

import java.util.Arrays;

public class DoubleArrayEx1 {
    public static void main(String[] args){


    int[][] arr = new int[2][3];
    int k = 10;
    for(int i = 0; i < arr.length; i++){//행에 대한 길이
        for(int j =0; j < arr[i].length; j++){//열에 대한 길이
            arr[i][j] = k;
            k+= 10;
        }
      }
        System.out.println(Arrays.toString(arr[0]));
        System.out.println(Arrays.toString(arr[1]));
        
       /* for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[i].length; j++){
                System.out.print(arr[i][j] + " ");
                //출력 구문을 for문으로 나타냄
            }*/
    }
}

 

int[][] arr = {
        {100, 200, 300},
        {400, 500, 600}
};


for(int i = 0; i < arr.length; i++){
    for(int j = 0; j < arr[i].length; j++){
        System.out.print(arr[i][j] + " ");
        
        //향상된 for문으로 출력
        for(int[] ints : arr){
            for(int e : ints){
                System.out.print(e + " ");
            }

 

2차원 배열 연습문제))

 

package 배열2차원연습문제;
//2차원 배열 성적 구하기 및 오름차순 정렬

public class DoubleArrayEx {
    public static void main(String[] args){
        double[] avr = {0,0,0,0,0,0};
        //배열을 5개 만들겠다
        int[][] student = {
                {1, 66, 77, 89, 0}, //학번, 국어, 수학, 영어, 총점
                {2, 80, 88 ,98, 0},
                {3, 100, 48, 33, 0},
                {4, 87, 98, 23, 0},
                {5, 100, 99, 98, 0},
                {6, 67, 99, 98, 0}
        };
        for(int i = 0; i < student.length; i++){
            //행에 대한 인덱스
            for(int j = 1; j < 4; j++){
                student[i][4] += student[i][j];
                //[i][4] = [i][4] + [i][j]
                //각 행 4번 인덱스에 0,1 , 0,2, 0,3의 값을 더해줌
            }
            avr[i] = (double)student[i][4]/3;
            System.out.printf("%d, %d, %.2f\n", student[i][0],student[i][4], avr[i]);
        }
    }
}

 

package 배열2차원연습문제;
//2차원 배열 성적 구하기 및 오름차순 정렬

public class DoubleArrayEx {
    public static void main(String[] args){
        double[] avr = {0,0,0,0,0,0};
        //배열을 5개 만들겠다
        int[][] student = {
                {1, 66, 77, 89, 0}, //학번, 국어, 수학, 영어, 총점
                {2, 80, 88 ,98, 0},
                {3, 100, 48, 33, 0},
                {4, 87, 98, 23, 0},
                {5, 100, 99, 98, 0},
                {6, 67, 99, 98, 0}
        };
        for(int i = 0; i < student.length; i++){
            //행에 대한 인덱스
            for(int j = 1; j < 4; j++){
                student[i][4] += student[i][j];
                //[i][4] = [i][4] + [i][j]
                //각 행 4번 인덱스에 0,1 , 0,2, 0,3의 값을 더해줌
            }
            avr[i] = (double)student[i][4]/3;
            System.out.printf("%d, %d, %.2f\n", student[i][0],student[i][4], avr[i]);
        }
        int tmp_num = 0;
        int tmp_total = 0;
        double tmp_avr = 0.0;
        System.out.println("학번\t 총점\t 평균");
        System.out.println("------------------------");
        for(int i = 0; i < student.length; i++) {
            for(int j = i; j < student.length; j++){
                if(student[i][4] < student[j][4]){
                    tmp_total = student[i][4];
                    student[i][4] = student[j][4];
                    student[j][4] = tmp_total;

                    tmp_num = student[i][0];
                    student[i][0] = student[j][0];
                    student[j][0] = tmp_num;

                    tmp_avr = avr[i];
                    avr[i] = avr[j];
                    avr[j] =tmp_avr;
                }
            }
            System.out.printf("%d, %d, %.2f\n", student[i][0],student[i][4], avr[i]);
        }
    }
}

**버블 정렬 사용

 

  1. 얕은 복사

객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 주 변수가 참조하는 것을 의미 합니다.

int[] arr1 = new int[4];
int[] arr2 = arr1;
package 배열의복사;

public class ArrayCopy {
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int len = 10;
        int[] arr2 = new int[len];
        arr2[0] = 100;
        arr2[1] = 200;
        System.arraycopy(arr1,0, arr2,2, arr1.length);
        for(int e : arr2) System.out.println(e);
    }
}

arraycopy(원본배열, 원본배열 시작인덱스, 복사할 배열, 복사할 배열 시작인덱스, 복사할 길이)

: 원본배열에 복사할 배열을 추가하는 것 (복사할 배열이 먼저옴 시작인덱스 갯수만큼)

 

 

예제))홀수짝수나누어담기

 

package 홀수짝수나누어담기;

import java.util.Arrays;
import java.util.Scanner;

// 7개의 정수를 입력 받아 홀수와 짝수 배열에 나누어 담기
// 입력 받는 inputInt()
// 홀수와 짝수를 계산하는 oddEven()
// 결과를 출력하는 disOutput()
// 입력 : 1 2 3 4 5 6 7
// 홀수 : 1 3 5 7
// 짝수 : 2 4 6
public class OddEvenCalc {
    int[] arr = new int[7]; // 정수를 입력 받는 배열
    int[] even = new int[7]; // 입력 받은 배열에서 짝수만 담는 배열
    int[] odd = new int[7];  // 입력 받은 배열에서 홀수만 담는 배열

    int eIdx = 0;
    int oIdx = 0;


    public void inputInt() {
        //사용자로 부터 7개의 정수를 입력 받아 배열에 저장
        Scanner sc = new Scanner(System.in);
        System.out.print("정수 입력 : ");
        for(int i = 0; i< 7; i++)
        arr[i] = sc.nextInt();
    }
    public void oddEven(){
        //arr배열에 저장된 값 중에서 홀수는 odd, 짝수는 even에 나누어 담기
        for(int i = 0; i< 7; i++ ) {
            if (arr[i] % 2 == 0) even[eIdx++] = arr[i];
            //index를 넣으면 홀수이던지 짝수이던지 같이 갯수가 올라감
             else odd[oIdx++] = arr[i];

        }
    }
    public void disOutput(){
       System.out.print("홀수 입력 : " );
       for(int i = 0; i < oIdx; i++) System.out.print(odd[i]+ " ");
       //끝부분에 0을 없애기 위해 (향상된 for문은 배열 갯수7개로 생각)
        // oIdx까지만 for문을 돌림 
       System.out.println();
       System.out.print("짝수 입력 : " );
       for(int i = 0; i < eIdx; i++) System.out.print(even[i]+ " ");
       //tostring은 배열을 수정하기 힘들기 때문에 원래 7개만큼 배열을 채우기 위해 뒤에 0이  출력됨
    }
}

 

package 홀수짝수나누어담기;

public class OddEvenExmain {

    public static void main(String[] args){
        OddEvenCalc calc = new OddEvenCalc();
        calc.inputInt();
        calc.oddEven();
        calc.disOutput();
    }
}