본문 바로가기

오답노트/Java

배열 연습문제

▶문제 1

 

다음은 배열을 선언하거나 초기화한 것이다.
잘못된 것을 고르고 그 이유를 설명하시오.

 

 

1
2
3
4
5
6
7
8
9
10
11
public class Method{
   
    public static void main(String[] args) {    
        a. int[] arr[];
        b. int[] arr = {1,2,3,};
        c. int[] arr = new int[5];
        d. int[] arr = new int[5]{1,2,3,4,5};
        e. int arr[5];
        f. int[] arr[] = new int[3][];
 
        }
cs

 

[풀이]

a.  int [] arr = new int [3]; 이 1차배열의 선언 형식이나 a처럼 쓰는 것도 가능하다.

 

b.  배열 변수를 초기화 하는 방법은 크게 3가지로 나누어진다.

 

출처:https://pridiot.tistory.com/27

 

1) 가장 일반적인 방법으로 참조변수의 기본값은 null이지만, 배열을 가리키는 참조 변수는 null대신

0인 배열로 초기화하기도한다.

2) 괄호 {} 안에 아무것도 넣지 않으면, 길이가 0인 배열이 생성된다.

3) new int []가 생략이 되기도 한다.

          => b는 3번 방법을 써서 배열을 초기화 시켰으며 마지막 , 은 없는게 좋지만 있다고 해서

               오류가 나지는 않는다.

 

c.  1차배열 선언형식 정답

 

d.  뒤에 {}로서 값이 대입이 되어있다면 2번째 []안에서 배열의 길이를 정할 순 없고 데이터갯수에 따라 자동으로 정해진다.

 

e.  배열을 선언할 때는 배열의 크기를 지정할 수 없다.

 

f. 가능한 식으로 행은 3칸, 열은 0칸인 배열이 생성된다.

 

 

▶문제2

 

다음과 같은 배열이 있을 때, arr[3].length의 값은 얼마인가?
int[][] arr = { { 5, 5, 5, 5, 5}, {10, 10, 10}, {20, 20, 20, 20}, {30, 30} };

 

1
2
3
4
5
6
7
8
9
10
 public static void main(String[] args) {    
    
    int [][] arr = {
        {55555},
        {10,10,10},
        {20,20,20,20},
        {30,30} //답 2
    };
    
    }
cs

 

[풀이]

문제 1의 풀이 b에 나와있는 2차배열 초기화 방법 3으로서 new int [][] 를 생략하고 값을 넣었다.

주의점은 마지막 괄호 {} 뒤에는 콤마,를 찍지 않으며 ;는 배열이 모두 끝난 } 뒤에 위치시킨다.

 

▶문제 3

 

 

배열 arr에 담긴 모든 값을 더하는 프로그램을 완성하시오.
public static void main(String[] args) {           
     int[] arr = {10, 20, 30, 40, 50};                
 }

 

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
            int[] arr = {1020304050};
           
            int sum = 0;
            for(int i = 0; i < arr.length; i++){
                sum += arr[i];
            }
            System.out.println(sum); // 150
       }
cs

 

 ▶문제 4

 

 

 2차원 배열 arr에 담긴 모든 값의 총합과 평균을 구하는 프로그램을 완성하시오.
int[][] arr = {                   
{ 5, 5, 5, 5, 5},                   
{10,10,10,10,10},                   
{20,20,20,20,20},                   
{30,30,30,30,30}           

};

 

 

1


2
3
4
5
6
7
8
9
10
11
12
public  class Array {
 
public static void main(String[] args) {           
    int[][] arr = {                   
        { 55555},                   
        {10,10,10,10,10},                   
        {20,20,20,20,20},                   
        {30,30,30,30,30}           
        };  
}// sum = 325,avg = 16.25
    }
 
cs

 

[답]

 

 

 

[풀이]

 

1) 총 합읕 열과 행을 구분지어 반복문을 실행시키기위해 2중 for문을 사용하였다. 여기의 포인트는 "j<arr[i].length"인데, 첫번째 for는 행을 담당하기에 arr.length는 큰 문제가 없지만, 열을 나타내려면 arr[i],length로 arr안의 어떤 행인지를 선택해주고 그 행의 길이를 구할 수 있게 해야지만 행과 열의 총 합이 출력된다.

 

2) 2차배열이니까 배열이름을 작성하고 행과 열을 나타낼 수 있도록 [][]를 작성한다.

 

3) 평균은 sum / 총 합을 나타내는데 그 총 합은 행의 첫번째 자리 * 열의 첫번째자리를 곱하면 자연스럽게 나온다. 이 때 행은 arr.length로 나타내주고 열은 arr[0].length로 설정하여 첫번째 열의 자리의 길이를 구할 수 있도록 한다.

 

4) 방법2에는 avg를 반복문 안에 넣어버렸다. 0부터 시작된 avg는 반복문이 돌아가면서 반복문끝까지 함께 하게 되고 반복문이 총 몇번 돌아갔는지를 체크하여 자연스럽게 arr배열의 갯수를 알 수 있게 된다.

 

5) 반복문의 갯수가 담겨있는 avg에 sum을 나눈 값을 다시 avg에 넣어 데이터를 아꼈다.

 

 ▶문제 5

 

다음은 1과 9사이의 중복되지 않은 숫자로 이루어진 3자리 숫자를 만들어내는 프로그램이다. (1)~(2)에 알맞은 코드를 넣어서 프로그램을 완성하시오. ([참고] Math.random()을 사용했기 때문에 실행결과와 다를 수 있다.)

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Exercise5_5 {
    public static void main(String[] args) {
        int[] ballArr = {1,2,3,4,5,6,7,8,9};
        int[] ball3 = new int[3];
     
        for(int i=0; i< ballArr.length;i++) {
  a)       int j = (int)(Math.random() * ballArr.length);
  b)       int tmp = 0;
            /*
  c)    (1) 알맞은 코드를 넣어 완성하시오.
             */ }
       
  d)    /* (2) */
        for(int i=0;i<ball3.length;i++) {
            System.out.print(ball3[i]); // 결과 : 486
        }
   } 
}
cs

 

[답]

 

(1)

tmp = ballArr[i];
ballArr[i] = ballArr[j];
ballArr[j] = tmp;

(2)

System.arraycopy(ballArr,0, ball3,0,3);

 

[해설]

 

a)Math.random(); 함수는 double형으로 0.0~0.9X..까지의 값을 반환한다.

 

b)임시저장변수로서 tmp 변수를 만들어준다.

 

c)만약, ballArr[i]의 i가 1일경우, {1,2,3,4,5,6,7,8,9}의 값이 있는 ballArr의 배열으로 ballArr[i]는 "2"가되고 이 "2"의 값은 tmp에 저장된다. java는 위에서 밑으로 내려가기에 두번째줄의 ballArr[i]는 여전히 ballArr[1]을 유지한채로 ballArr[j]를 만나게되는데 이 상태에서 j역시 랜덤한 값을 받게된다. 예를들어 ballArr[1] = ballArr[4]의 경우가 된다면? j인 ballArr[4]의 값은 "5"가 되고 ballArr[1] = 5 값으로 변경된다. 그럼 ballArr의 값은 {1,5,3,4,5,6,7,8,9}가 되고 마지막줄로 내려간다. ballArr[j]는 ballArr[4]로 마지막줄까지 내려오게되고 tmp를 만나게되는데 여기엔 처음 ballArr[1]이 담아두었던 "2"라는 값이 존재함으로 ballArr[4]의 값은 2가 되게되고 최종적으로 ballArr의 배열은 {1,5,3,4,2,6,7,8,9}로 변경된다. 

 

d)

 

 ▶문제 6

 

다음은 거스름돈을 몇 개의 동전으로 지불할 수 있는지를 계산하는 문제이다.
변수 money의 금액을 동전으로 바꾸었을 때 각각 몇 개의 동전이 필요한지 계산해서 출력하라.
단, 가능한 한 적은 수의 동전으로 거슬러 주어야한다.
(1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.
[Hint] 나눗셈 연산자와 나머지 연산자를 사용해야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
class Exercise5_6 {
    public static void main(String args[]) {
        // 큰 금액의 동전을 우선적으로 거슬러 줘야한다.
        int[] coinUnit = {5001005010};
        int money = 2680;
       System.out.println("money="+money);
        for(int i=0;i<coinUnit.length;i++) {
            /*
        (1) 알맞은 코드를 넣어 완성하시오.
             */ }
   }
// 500원 = 5장
// 100원 = 1장
// 50원 = 1장
// 10원 = 3장
}
cs

 

 

[답]

System.out.println(coinUnit[i]+"원: "+money/coinUnit[i]);
money = money%coinUnit[i];

 

[풀이]

500원이 몇개필요한지, 100원이 몇개필요한지는 총 money 에서 나누기 500을 하면 필요한 500의 수가 나온다. coinUnit배열 안에 {500, 100, 50, 10}의 값이 순차적으로 있으니 이 값을 i를 통해 순차적으로 나오게하고 값을 나누면 500 - 100 - 50 - 10순으로 필요한 동전의 수가 나오게되는데 여기서 포인트는 처음 500원에서 나누기를 한 값이 money에 누적이 되어야하고 그 누적된 값이 100과 나누어져야한다는 것이다. 그러기 위해 %를 사용하여 500원으로 나눈 후 money를 %로 몫을 때내고 나머지의 값만 저장시켜 100과 나누게 한다. 동전의 갯수(coinUnit.length)만큼 반복시킨다.

 

 

 ▶문제 7

 

다음은 배열 answer에 담긴 데이터를 읽고 각 숫자의 개수를 세어서 개수만큼 '*'을 찍어서 그래프를 그리는 프로그램이다. (1)~(2)에 알맞은 코드를 넣어서 완성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  class Array {
    public static void main(String[] args) {
        int[] answer = { 14431442132 };
        int[] counter = new int[4];
        for (int i = 0; i < answer.length; i++) {
            /* (1) 알맞은 코드를 넣어 완성하시오. */
        }
        for (int i = 0; i < counter.length; i++) {
            /* 알맞은 코드를 넣어 완성하시오 (2) . */
            System.out.println();
        }
    }
}
/* 실행결과 :
3*** 
2** 
2** 
4**** */
cs

 

[아직 못품]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public  class Array {
    public static void main(String[] args) {
        int[] answer = { 14431442132 };
        int[] counter = new int[4];
        int a = 0;
 
        for (int i = 0; i < counter.length; i++) {
            a =  answer[i] - 0 ;
            System.out.print(a + ",");
            
            for(int j = 0; j <a; j++){
                System.out.print("*");
                 } System.out.println();
             }
                    }
            
}
/*1,*
4,****
4,****
3,***
*/
 
cs

 

▶문제 9

 

주어진 배열을 시계방향으로 90도 회전시켜서 출력하는 프로그램을 완성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Exercise5_9 {
    public static void main(String[] args) {
        char[][] star = {
                {'*','*',' ',' ',' '},
                {'*','*',' ',' ',' '},
                {'*','*','*','*','*'},
                {'*','*','*','*','*'}
        };
        char[][] result = new char[star[0].length][star.length];
        for(int i=0; i < star.length;i++) {
            for(int j=0; j < star[i].length;j++) {
                System.out.print(star[i][j]);
            }S
            ystem.out.println();
        }
        System.out.println();
        for(int i=0; i < star.length;i++) {
            for(int j=0; j < star[i].length;j++) {
                /*
    (1) 알맞은 코드를 넣어 완성하시오.
                 */ }
        }
        for(int i=0; i < result.length;i++) {
            for(int j=0; j < result[i].length;j++) {
                System.out.print(result[i][j]);
            }S
            ystem.out.println();
        }
    } // end of main
// end of class
cs

 

'오답노트 > Java' 카테고리의 다른 글

클래스 상속 연습문제(1)  (0) 2022.03.19
조건문 연습문제  (0) 2022.03.17
메서드 연습문제  (0) 2022.03.11
연산자 연습문제  (0) 2022.03.07
변수 연습문제  (0) 2022.03.04