공부/자료구조

[자료구조-02] 배열의 활용

줭♪(´▽`) 2021. 4. 13. 12:44

1. 배열(Array)

- 가장 기본적이고 간단한 자료구조

- 같은 자료형의 변수로 이루어진 구성 요소(component)가 모인 것

 

 

배열 

ju-zero.tistory.com/22?category=900872

 

[Java-05] 배열(Array) - 1차원 배열

1. 배열(array)이란? 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것 ex) int[] score = new int[5]; -> 5개의 int값을 저장할 수 있는 배열을 생성함 2. 배열의 선언과 생성 1) 배열 선언 - 생성된 배열을.

ju-zero.tistory.com

 

- Java를 공부하면서 배열의 개념에 대해서 익혔기 때문에, 배열을 다루는 여러 방법을 공부해보려고 한다.

 

2. 배열의 복제(클론)

 

배열이름.clone()

 

int[] a = {1, 2, 3, 4, 5};		// 1,2,3,4,5
int[] b = a.clone();			// 1,2,3,4,5

 

 

3. 배열 요소의 최댓값, 최솟값 구하기

 

최댓값 구하기

(1) 첫 번째 요소의 값을 max 변수에 대입하기
(2) 반복문과 if를 사용하여 배열의 모든 요소를 비교
(3) max와 비교하였을 때 해당 요소의 값이 max보다 크면 max에 해당 요소의 값 대입하기

 

int[] a = {1, 2, 3, 4, 5};
max = a[0];
for(int i = 1; i < a.length; i++)
	if(a[i] > max)
    	max = a[i];

 

 

최솟값 구하기

(1) 첫 번째 요소의 값을 min 변수에 대입하기
(2) 반복문과 if를 사용하여 배열의 모든 요소를 비교
(3) min와 비교하였을 때 해당 요소의 값이 min보다 작으면 min에 해당 요소의 값 대입하기

 

int[] a = {1, 2, 3, 4, 5};
min = a[0];
for(int i = 1; i < a.length; i++)
	if(a[i] < max)
    	min = a[i];

 

 

4. 난수를 사용해 배열의 요솟값 설정하기

 

java.util 패키지의 Random 클래스를 사용

(1) Random 클래스를 import함
(2) Random 클래스 변수를 선언
(3) 난수를 생성하는 메서드 nextInt() 호출

nextInt() : 정수 범위의 난수를 반환
nextInt(n) : 0 부터 n-1까지의 난수를 반환
nextBoolean(), nextLong(), nextDouble(), nextFloat()도 존

 

import java.util.Random;

...


Random rand = new Random();

int[] a = new int[5];
for(int i = 0; i < 5; i++)
	a[i] = rand.nextInt(90);	// 0 ~ 89 범위의 난수 저장
    

 

 

5. 배열 요소를 역순으로 정렬하기

 

(1) 맨 앞의 요소와 맨 뒤의 요소의 값을 교환
(2) 각각 하나씩 안쪽의 요솟값을 교환
(3) 총 교환 횟수는 '요소 개수 / 2' -> 요소 개수가 홀수여도 가운데 요소는 교환할 필요가 없기 때문

 

int[] a = {12, 4, 29, 99, -4, 127};

int t = 0;
for(int i = 0; i < a.length / 2; i++) {
    t = a[i];					// 임시변수 t에 앞의 값 저장
    a[i] = a[a.length-i-1];		// 앞의 값에 뒤의 값 저장
    a[a.length-i-1] = t;		// 뒤의 값에 임시변수 t의 값 저장
}

 

6. 두 배열의 비교

 

(1) 두 배열의 요솟수(길이)를 비교, 같지 않으면 false 반환
(2) for문으로 두 배열을 처음부터 스캔하면서 a[i]와 b[i]의 값을 비교, 다른 요소가 있으면 false 반환
(3) for문이 중단되지 않고 끝까지 실행되면 true를 반환

 

int[] a = {1, 2, 3, 4, 5};
int[] b = {1, 2, 3, 4, 5};

if(a.length != b.length)
    return false;
    
for(int i = 0; i < a.length; i++)
    if(a[i] != b[i])
        return false;
        
return true;

 

7. 기수 변환

 

진법

ju-zero.tistory.com/16?category=900872

 

[Java-02] 변수(Variable) - 진법

1. 10진법과 2진법 - 컴퓨터는 2진수(0과 1)밖에 모르기 때문에 10진수로 입력하여도 2진수로 바뀌어 저장된다. int age = 25; 보이는 것 실제 저장 age : 25  -------> age : 11001 2. 비트(bit)와 바이트(byte)..

ju-zero.tistory.com

 

정수값 x를 r진수로 변환하기

(1) x%r 을 인덱스로 하는 문자(dchar.charAt() 사용)를 배열 d의 요소 d[digits]에 대입하고 digits 값을 증가시킴
(2) x를 r로 나눔
(3) x가 0이 될 때까지 반복
(4) x가 0이 됐을 때 digits는 자릿수, d는 변환한 후의 값이 역순으로 저장된 배열이 됨

 

static int cardConvR(int x, int r, char[] d) {
    int digits = 0;		// 변환 후의 자릿수
    String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    do {
    	d[digits++] = dchar.charAt(x % r);
        x /= r;
    } while(x != 0);
    
    return digits;
}

public static void main(String[] args) {
    int x = 59;
    int r = 16;
    int digits = 0;
    char[] d = new char[32];
    
    digits = cardConvR(x, r, d);
    
    for(int i = digits - 1; i >= 0; i--)
    	System.out.print(d[i]);
}

 

8. 소수의 나열

 

1) 기본 알고리즘

 

소수 : 2부터 n - 1까지의 어떤 정수로도 나누어떨어지지 않는 수

예를 들어, 2부터 1000까지 숫자 중 소수를 나열하려면
(1) for문을 사용하여 2부터 1000까지 다음을 반복
(2) 이중 for문을 삽입하여 바깥 for문의 숫자(i)가 안쪽 for문의 숫자(j)로 나누어 떨어지면 break하여 탈출
(3) 마지막까지 나누어떨어지지 않으면 소수이므로 출력

 

for(int i = 2; i <= 1000; i++) {
    int j;
    for(j = 2; j < i; j++) {
    	if(i % j == 0)
        	break;
    }
    if (i == j)
    	System.out.println(i);
}

 

 

2) 알고리즘 개선(1)

 

소수 : n보다 작은 소수들로 나누어떨어지지 않는 수
예를 들어, 7이 소수인지는 7보다 작은 소수 2, 3, 5로 나눗셈하면 충분함

(1) 앞서 구한 소수를 저장하는 배열 prime 선언
(2) 2는 소수이므로 prime[0]에 저장
(3) 4 이상의 짝수는 2로 나누어떨어지므로 배제하고, 3 이상의 홀수로만 검사
(4) 3 이상의 홀수 중 이미 찾은 소수로 나누어 떨어지면 소수가 아니므로 break하여 탈출
(5) 마지막까지 나누어떨어지지 않으면 소수이므로 prime에 저장

 

int ptr = 0;				// 찾은 소수의 개수
int[] prime = new int[500];		// 찾은 소수를 저장할 배열

prime[ptr++] = 2;		// 2는 소수

for(int i = 3; i <= 1000; i += 2) {	// 대상은 홀수만
    int j;
    for(j = 1; j < ptr; j++)
    	if(i % prime[j] == 0)
        	break;
    if(ptr == j)
    	prime[ptr++] = i;
}

for(int i = 0; i < ptr; i++)
	System.out.println(prime[i]);
	

 

 

3) 알고리즘 개선(2)

 

소수 : n의 제곱근 이하의 어떤 소수로도 나누어떨어지지 않는 수

(1) 알고리즘 개선(1)과 동일하게 진행함
(2) prime의 배열 요소 중 prime[i]의 제곱이 n 이하인 요소만 나누어봄
(3) 마지막까지 나누어떨어지지 않으면 소수이므로 prime에 저장

 

int ptr = 0;				// 찾은 소수의 개수
int[] prime = new int[500];		// 찾은 소수를 저장할 배열

prime[ptr++] = 2;		// 2는 소수
prime[ptr++] = 3;		// 3은 소수

for(int i = 5; i <= 1000; i += 2) {	// 대상은 홀수만
    boolean f = false;
    for(int j = 1; prime[j] * prime[j] <= i; j++) {
    	if(i % prime[j] == 0) {
        	f = true;
        	break;
        }
    }
    if(!f)
    	prime[ptr++] = i;
}

for(int i = 0; i < ptr; i++)
	System.out.println(prime[i]);
	

 

9. 다차원 배열

- 2차원 배열(배열을 구성 요소로 함), 3차원 배열(2차원 배열을 구성 요소로 함) 등을 나타내는 말

 

String, 2차원 배열

ju-zero.tistory.com/24?category=900872

 

[Java-05] 배열(Array) - String 배열, 2차원 배열

1. String 배열 1) String 배열의 선언과 생성 String[] name = new String[3]; - String타입의 참조변수를 저장하기 위한 공간이 마련 - 참조형 변수의 기본값은 null이므로 각 요소는 null로 초기화 2) String..

ju-zero.tistory.com

 

10. 한 해의 경과 일 수를 계산하기

 

m월 d일의 그 해 경과 일수
1월, 2월, ... , m - 1월의 일 수의 합 + d

평년과 윤년의 차이
평년 :
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
윤년 : {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

(1) 평년인지 윤년인지 확인
(2) 2차원 배열을 생성하여 평년일수 배열과 윤년일수 배열을 생성
(3) 1월~(m-1)월의 일 수를 더함
(4) d를 더함

 

static int[][] mdays = {
    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},	// 평년
    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}	// 윤년
}

static int isLeap(int year) {
    // 0이면 평년, 1이면 윤년
    return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 1 : 0;
}

static void main(String[] args) {
    int y = 2021;
    int m = 4;
    int d = 15;
    
    int total = d;
    for(int i = 1; i < m; i++) {
    	// 0이면 평년, 1이면 윤년
    	total += mdays[isLeap(y)][i-1];
    }
}

 

 

 

 

참고 - Do it! 자료구조와 함께 배우는 알고리즘 입문 : 자바 편 (저자 : 보요 시바타, 출판 : 이지스 퍼블리싱)

'공부 > 자료구조' 카테고리의 다른 글

[자료구조-05] 힙(Heap)  (0) 2021.10.13
[자료구조-04] 큐(Queue)  (0) 2021.04.20
[자료구조-03] 스택(Stack)  (0) 2021.04.18
[자료구조-01] 자료구조, 시간복잡도  (0) 2021.03.08