본문 바로가기
개발 & 기술

[Java] arraycopy를 이용해서 1부터 9까지의 수 중 겹치지 않는 세 자리 수 출력하기

by chococake 2021. 6. 28.

자바를 공부하면서 처음에는 예습을 한 만큼 할만한 부분이 많았는데 확실히 배열을 들어가면서 난이도가 확 뛰는 느낌이다. 단순한 로직이 아닌 중간에 배열이 생기면서 뭔가 한번 더 꼬아서 생각을 해야하는 부분이 생긴 것이다. 그래서 예전만큼 연습문제가 할만하다는 기분이 들지 않는다. 적어도 여기서부터는 예습과 복습을 정말 철저히 해야겠다는 생각이 든다.

 

오늘은 자바 배열복사(arraycopy)를 이용해서 1부터 9까지의 수 중 겹치지 않는 세 수를 골라서 세 자리의 정수를 만드는 실습을 해보려고 한다. 사실 예전에 한번 했던 건데 다시 복습을 해도 쉽지 않은 예제라고 느꼈다. 그런만큼 이렇게 한번 정리는 제대로 하고 가야할 필요가 있다고 느낀다.

 

일단 결과물은 아래와 같다. 실행을 하면 세 자리의 수가 나오는데 0이 포함되지 않은 1부터 9까지의 수를 이용해서 겹치지 않은 세 자리의 수를 만든다. 얼핏 보면 간단한 로직일 것 같지만 생각보다 고려해야할 부분이 많다.

 

 

 

먼저 완성 코드를 보면 다음과 같다. 

 

 

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
31
32
package ex20210628;
 
public class ArrayExam04 {
 
    public static void main(String[] args) {
        
        
        int[] numbers = new int[] {1,2,3,4,5,6,7,8,9};
        
        int[] selected = new int[3];
        
        for(int i = 0; i<numbers.length; i++) {
            int j = (int) (Math.random() * numbers.length); // 1~9 중의 하나 
            int tmp = 0;
            tmp = numbers[i];
            numbers[i] = numbers[j];
            numbers[j] = tmp; 
        }
        
        System.arraycopy(numbers, 0, selected, 03);
        for(int i = 0; i<selected.length; i++) {
            System.out.print(numbers[i] + "");
        }
        
        
        
        
        
    }
 
}
 
cs

 

 

 

 

우선은 1부터 9까지 있는 배열을 만들고 그 배열에서 딱 세 숫자만 가져와서 담을 수 있는 배열(selected)를 만든다. 그 다음에 반복문을 세번 돌려주는 데 딱 세번 돌려야 selected 배열에 숫자가 세 개가 들어오기 때문이다. 먼저 numbers에 맨 앞에 있는 수를 선택한다. 여기서는 1이 될 것이다. 그 다음에는 배열 numbers에 있는 수 중 아무거나 하나를 고른다. 이때 앞에 골랐던 1과 겹쳐도 상관 없다. 그리고 나서 임시로 하나의 칸을 만들어주고 거기에 0을 초기화한다.

 

 

1
2
3
4
5
6
7
int[] numbers = new int[] {1,2,3,4,5,6,7,8,9};
        
        int[] selected = new int[3];
        
        for(int i = 0; i<numbers.length; i++) {
            int j = (int) (Math.random() * numbers.length); // 1~9 중의 하나 
            int tmp = 0;
cs

 

결과적으로 tmp에는 0, numbers 맨 앞자리인 1, 그리고 랜덤으로 고른 숫자 하나가 선택이 된다. 이제 이 숫자들을 이동해주면 되는데 여기서 0은 우리가 쓰지 않기 때문에 가장 먼저 tmp 자리에 1을 초기화한다. (1인 이유는 numbers[0]이기 때문이다.)

 

1
2
3
tmp = numbers[i];
            numbers[i] = numbers[j];
            numbers[j] = tmp; 
cs

 

그리고 numbers[0]이 있던 자리에는 랜덤 숫자를 초기화한다. 마지막으로 랜덤 숫자가 있었던 자리에는 tmp에 있던 값을 초기화한다. 이때 tmp값은 1이다. 그 이유는 맨 처음에 0이 있었던 tmp에 1을 넣었기 때문이다.

 

이렇게 되면 다음과 같은 순서를 가지게 된다. 예를 들어서 랜덤 값을 7이라고 가정할 경우

tmp에는 1, numbers[0] = 7, numbers[j] = 1 이라는 결과가 나온다.

 

그리고 배열로 표현하게 되면 tmp = 1, numbers[] = { 7,2,3,4,5,6,1,8,9}가 된다.

 

이제 여기서 arraycopy를 이용해서 맨 앞의 세 자리의 수를 가져오기만하면 된다.

 

 

 

 

 

arraycopy의 사용법은 아래와 같다.

 

System.arraycoypy(원래 배열, 원래 배열에서 옮기려고 하는 시작지점(인덱스), 도착 배열, 도착 배열에 옮기려고 하는 도착지점(인덱스), 복사할 인덱스의 양) 

 

1
2
3
4
System.arraycopy(numbers, 0, selected, 03);
        for(int i = 0; i<selected.length; i++) {
            System.out.print(numbers[i] + "");
        }
cs

 

여기서는 배열 numbers의 0번째를 배열 selected의 0번째부터해서 3인덱스만큼 복사하겠다는 의미다. 그러고 나서 옮겼던 배열의 값들을 출력해주면 된다. (여기서는 selected[i]가 되어야 하는데 잘못 나왔다.)

 

이렇게 해주면 결과값으로 1부터 9까지의 수 중에서 겹치지 않는 세 자리수가 출력이 된다. 

댓글