본문 바로가기

자료구조

기본 자료구조

자료구조

데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계

  • 데이터 단위 : 데이터를 구성하는 한 덩어리
  • 자료구조 : 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법

배열의 복제(클론)

배열 이름.clone() : 다차원 배열의 복제는 되지 않음

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;


public class Main {
	public static void main(String[] args) throws IOException{
		int[] a = {1,2,3,4,5};
		int[] b = a.clone();
		System.out.println(Arrays.toString(b));
	}
}

주사

배열의 요소를 하나씩 차례로 살펴보는 과정


접근 제한자

객체의 맴버에 대한 접근을 제한할 때

  1. public : 모든 접근 허용
  2. protected : 같은 패키지의 객체, 상속 관계의 객체 허용
  3. default : 같은 패키지의 객체 허용
  4. private : 현제의 객체 안에서만 허용

난수

import java.io.IOException;
import java.util.Random;
import java.util.Scanner;


public class Main {
	public static void main(String[] args) throws IOException{
		Random rand = new Random();
		int a = rand.nextInt(90);
		System.out.println(a);
	}
}

의사 : 실제와 비슷하다는 뜻

 

컴퓨터에서 생성하는 난수는 진짜 난수가 아니다.

srand 메서드에 전달한 seed의 값과 컴퓨터 환경이 같다면 그 결과값은 항상 같다.

결국 컴퓨터에 의해 생성된 모든 난수는 미리 컴퓨터가 계산해 둔 의사난수이다.


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

import java.io.IOException;
import java.util.Arrays;


public class Main {
	public static void main(String[] args) throws IOException{
		int[] a = {1,2,3,4,5};
		reverse(a);
		System.out.println(Arrays.toString(a));
	}
	static void swap(int [] a, int idx1, int idx2) {
		int t = a[idx1];
		a[idx1] = a[idx2];
		a[idx2] = t;
	}
	static void reverse(int[] a) {
		for (int i =0; i < a.length / 2 ; i++) {
			swap(a, i, a.length - i - 1);
		}
	}
}

기수 변환

import java.io.IOException;
import java.util.Arrays;


public class Main {
	public static void main(String[] args) throws IOException{
		int no = 59; //변환하는 정수
		int cd = 16;  //기수
		int dno; //변환 후의 자릿수
		char[] cno = new char[32]; //변환 후 각 자리의 숫자를 넣어두는 배열
		dno = cardConvR(no, cd, cno);
		for(int i = dno-1; i >=0; i--)
			System.out.print(cno[i]);
	}
	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;
	}
}

x가 59이고 r이 16이라면 x%r은 11이다

dchar.charAt(x%r)가 반환하는 것은 문자 B이다.

 

매서드 맨 앞에서 0으로 초기화하는 digits는 변환한 수의 자릿수를 나타내기 위한 변수이다.

do문 루프 본문에서는 다음 작업을 수행한다.

  1. x를 r로 나눈 나머지를 인덱스로 하는 문자를 배열 d의 요소 d[digits]에 대입하고 digits값을 증가시킨다.
  2. x를 r로 나눈다.

소수 구하기

 

import java.io.IOException;
import java.util.Arrays;


public class Main {
	public static void main(String[] args) throws IOException{
		int counter = 0; //곱셈과 나눗셈의 횟수
		int ptr = 0; //찾은 소수의 개수
		int[] prime = new int[500]; //소수를 저장하는 배열
		
		prime[ptr++] = 2; //2는 소수
		prime[ptr++] = 3; //3은 소수
		
		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]);
	}
}

약수의 대칭성

5 * 20 과 20 * 5는 가로 세로가 다르지만 같은 직사각형이라고 말할 수 있다.

 

넓이가 100이라는 것은 직사각형의 어느 한 변으로 나눌 수 있다는 의미이다. 이러한 성질을 이용하여 제곱근을 한 변으로 하는 이후의 직사각형에 대한 계산량을 줄이는 것

 

즉 어떤 정수 n은 다음 조건을 만족하면 소수라고 판단할 수 있다.

  • n의 제곱근 이하의 어떤 소수로도 나누어떨어지지 않습니다.
  • prime[i]의 제곱이 n이하인가?

if문에서 flag가 true가 될 때 곱셈 prime[i] * prime[i]의 횟수는 이미 포함되므로 flag가 false일 때(n이 소수인 경우)만 counter를 증가시킨다.


클래스

임의의 데이터형을 자유로이 조합하여 만들 수 있는 자료구조

  1. 클래스 본체에서는 다음과 같은 내뇽을 선언할 수 있습니다.
    1. 맴버(필드/메서드/중첩클래스/중첩인터페이스
    2. 클래스 초기화 / 인스턴스 초기화
    3. 생성자
  2. 필드/메서드/생성자를 선언할 대 public/protected/private을 지정할 수 있습니다.
  3. 메서드/생성자는 다중으로 정의(오버로드)할 수 있습니다.
  4. final로 선언한 필드는 한 번만 값을 대입할 수 있습니다.
  5. 생성자는 새로 생성한 인스턴스의 초기화를 위해 사용됩니다.

(오버로드란 메서드나 생성자를 정의할 때 형식은 다르지만 같은 이름을 붙이는 것입니다.)

class A {
	private int f1; //비공개 필드
	protected int f2; //한정 공개 필드
	public int f3; //공개 필드
	
	static final int S1 = 0; //정적 상수 필드
	
	public A() { //생성자
		f1 = f2 = f3 = 0; 
	}
	public A(int f1, int f2, int f3) { //생성자
		this.f1 = f1;
		this.f2 = f2;
		this.f3 = f3;
	}
	public void setF1(int f) {
		f1 = f;
	}
	public int getF1() {
		return f1;
	}
}

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

정렬  (0) 2021.08.17
재귀 알고리즘  (0) 2021.08.14
스택과 큐  (0) 2021.08.14
검색  (0) 2021.08.13
기본 알고리즘  (0) 2021.08.13