초코레

기본 자료구조 본문

알고리즘

기본 자료구조

초코레 2019. 12. 20. 16:16
  • 배열의 요소나 클래스의 필드는 초깃값으로 초기화가 되지만 메서드 안에서 선언한 지역 변수는 초깃값으로 초기화되지 않는다.
  • 배열의 길이는 프로그램을 컴파일할 때가 아니라 실행할(runtime) 때 결정된다.
  • 난수 생성에 사용할 수 있는 java.util.Random 클래스와 java.lang.Math 클래스
  • 배열 안의 두 요소를 교환하는 것은 자주 사용하므로 독립적인 메서드로 구현하자.

소수 구하기

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
public class PrimeNumber2 {
 
    //소수 구하기
    public static void main(String[] args) {
        int counter = 0;            //나눗셈의 횟수
        int ptr = 0;                //찾은 소수의 개수
        int[] prime = new int[500]; //소수를 저장하는 배열
        
        prime[ptr++= 2//2는 소수이므로 추가
        
        //대상은 홀수만, 4 이상의 짝수는 2로 나누어 떨어지므로 소수가 아니기 때문
        for (int n = 3; n <= 1000; n+=2) { 
            
            int i; //1부터 시작. 판단 대상인 n이 홀수이므로
            for (i = 1; i < ptr; i++) {
                counter++;
                if(n % prime[i] == 0) {
                    break;
                }
            }
            if(ptr == i) { //안쪽 for문이 중단되면 소수가 아님 = i는 ptr보다 작음
                prime[ptr++= n;
            }
        }
        
        for (int i = 0; i < ptr; i++) {
            System.out.println(prime[i]);
        }
        System.out.println("나눗셈을 수행한 횟수 : " + counter); //14622
    }
}
cs
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
33
34
35
36
37
38
39
public class PrimeNumber3 {
 
    public static void main(String[] args) {
        int counter = 0;            //나눗셈의 횟수
        int ptr = 0;                //찾은 소수의 개수
        int[] prime = new int[500]; //소수를 저장하는 배열
        
        prime[ptr++= 2//2는 소수이므로 추가
        prime[ptr++= 3//3은 소수이므로 추가
        
        //정수 n이 n의 제곱근 이하의 어떤 소수로도 나누어떨어지지 않는다면 소수이다.
        //prime[i]가 n의 제곱근 이하인지 = prime[i]의 제곱이 n 이하인지
        
        //대상은 홀수만
        for (int n = 5; n <= 1000; n+=2) {
            boolean flag = false;
            
            for (int i = 1; prime[i] * prime[i] <= n; i++) {
                counter += 2;
                if (n % prime[i] == 0) {
                    flag = true;
                    break;
                }
            }
            
            //마지막까지 나누어떨어지지 않으면 소수이므로 배열에 저장
            if(!flag) {
                prime[ptr++= n;
                counter++;
            }
        }
        
        for (int i = 0; i < ptr; i++) {
            System.out.println(prime[i]);
        }
        
        System.out.println("곱셈과 나눗셈을 수행한 횟수 : " + counter); //3774
    }
}
cs

 

  • 클래스를 간단하게 사용하기 위해 명시적으로 import를 선언할 필요가 있다. 하지만 JAVA 언어와 밀접하게 연관된 클래스나 인터페이스 등을 모아놓은 java.lang 패키지는 import를 선언할 필요가 없다. 따라서 이 패키지에 속하는 Integer나 String 등의 클래스는 import를 선언하지 않고 간단한 이름만으로 나타낼 수 있다.
  • 배열의 접근은 모두 런타임(실행 시)에 검사되기 때문에 만약 배열 길이 이상의 인덱스에 접근하면 IndexOutOfBoundsException이 발생한다.
  • 다차원 배열을 복제(clone)하면 최상위의 1레벨만 수행된다. 예를 들어 아래와 같이 복제한다면 a[0], a[1]만 복제되고 그 아래 레벨의 배열은 복제되지 않고 공유된다.
1
2
int[][] a = {{1234}, {567}};
int[][] b = a.clone();
cs

'알고리즘' 카테고리의 다른 글

이진 검색(binary search)  (0) 2019.12.23
선형 검색(linear search)  (0) 2019.12.21
기본 알고리즘  (0) 2019.12.19
[알고리즘 개념정리] 퀵 정렬  (0) 2019.06.08
[알고리즘 개념정리] 재귀  (0) 2019.06.07