본문 바로가기
알고리즘/개념

[알고리즘] 02 기본 자료구조

by dokii 2021. 11. 26.
728x90
반응형

02-1 배열

  1. 자료구조
    • 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계를 말한다.
    • 쉽게 말해 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법.
  2. 배열
    • int[] a; //배열의 선언
    • a= new int[5] //배열의 초기화. a는 길이가 5인 배열을 참조합니다.
    • int[] a = n ew int[] {1,2,3,4,5}; // 선언과 초기화를 동시에.
    • 배열은 같은 형의 구성 요소가 직선모양으로 연속하여 줄지어 있는 단순한 자료구조다.
    • 배열이름[인덱스] 
    • 배열이름.clone() //배열의 복사
    • 구성요소가 n개인 배열의 구성요소는 a[0], a[1], a[2].....a[n-1]이다.
    • 배열의 길이
      배열이름.length
    • 초기값은 0이며, boolean은 false다.
  3. 배열 요소의 최댓값구하기

    int max = a[0];
    for (int i=0; i<a.length; i++) {
    	if (a[i] >max) {
        	max = a[i];
        }
     	return max;
     }​
  4. 배열 요소를 역순으로 정렬하기
    • 교환 횟수는  요소갯수/2다. 나머지는 버린다. 홀수인 가운데는 바꿀필요가 없으니까.
    • for(i=0; i<n/2; i++) {
      	int t= a[i];
          a[i] = a[n-i-1];
          a[n-i-1] = t;
        }
    • 두값의 교환
      static void swap(int[]a, int index1, int index2) { 
      	int t = a[index1]; 
          a[index1] = a[index2]; 
          a[index2] = t; 
      }​
      
      static void reverse(int[] a) {
      	for(int i=0; i<a.length/2; i++) {
          	swap(a,i,a.length-i-1);
        	}
      }
      
      public static void main(String[] args) {
      	Scanner sc = new Scanner(System.in);
          
          int num = sc.nextInt();
          int[] x = new int[num]; //길이가 num인 배열생성
          
          for (int i=0; i<num; i++) {
          	x[i] =sc.nextInt();
          }
          
          reverse(x); //함수호출
          
          System.out.println("역순정렬");
          for (int i=0; i<num; i++){
          	System.out.println("x[" + i + "]=" + x[i]);
        	}
       }//main
       
  5. 두 배열의 비교
    • 두 배열의 모든 요소 값이 같은가를 판단하는 메서드 구현하기
      import java.util.*;
      
      public class do_02_05 {
      
      	//배열을 비교하는 메서드
      	static boolean equals(int[]a, int[] b) {
      		if(a.length != b.length) {
      			return false;
      		}
      		
      		for (int i=0; i<a.length; i++) {
      			if(a[i]!=b[i]) {
      				return false;
      			}
      		}
      		
      		return true;
      	}
      	
      	
      	public static void main(String[] args) {
      		Scanner sc = new Scanner(System.in);
      		
      		System.out.println("배열a의 길이를 입력하세요");
      		int numA = sc.nextInt();
      		
      		int[] a = new int[numA];
      		
      		for(int i=0; i<numA; i++) {
      			System.out.println("a["+i+"]:");
      			a[i] = sc.nextInt();
      		}
      		
      		//배열 b
      		System.out.println("배열b의 길이를 입력하세요");
      		int numB = sc.nextInt();
      		
      		int[] b = new int[numB];
      		
      		for(int i=0; i<numB; i++) {
      			System.out.println("b["+i+"]:");
      			b[i] = sc.nextInt();
      		}
      		
      		//함수호출
      		System.out.println("배열a와 b는" + (equals(a,b)?"같습니다":"다릅니다"));
      
      	}
      
      }​
  6. 기수 변환
    • 16진수는 아래 16개의 문자로 표현되는 수다.
      0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
    • 8진수는 아래 8개의 숫자를 사용하여 수를 나타낸다.
      0,1,2,3,4,5,6,7
    • import java.util.*;
      
      //기수 변환
      public class do_02_06 {
      
      	//정수값x를 r진수로 변환하여 배열d에 아랫자리부터 넣어놓고 반환을 시작한다.
      	static int cardConvR(int x, int r, char[] d) {
      		int digits =0;
      		String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      		
      		do {
      			d[digits++]= dchar.charAt(x%r); //r로 나눈 나머지
      			x /= r;
      		}while (x!=0);        
      		
      		return digits;
      		
      	}
      	public static void main(String[] args) {
      		Scanner sc = new Scanner(System.in);
      		
      		int no; //변환할 정수
      		int cd; //기수
      		int dno; //변환후 자릿수
      		char[] cno = new char[32]; //변환후 각 자리를 담을배열
      		
      		System.out.println("10진수를 기수로 변환해볼까요");
      		
      			do {
      				System.out.println("변환할 음이 아닌 정수");
      				no = sc.nextInt();
      			}while (no <0);
      			
      			do {
      				System.out.println("어떤 진수로 변환할까요 (2~36)");
      				cd = sc.nextInt();
      			}while(cd<2 || cd>36);
      			
      			dno = cardConvR(no, cd,cno); //자릿수가 담긴다.
      			
      			System.out.print(cd + "진수는 ");
      			for (int i=dno-1; i>=0; i--) {
      				System.out.print(cno[i]);
      			}
      			System.out.println("입니다");
      		
      
      	}
      
      }
  7. 소수의 나열
    • 소수는 자신과 1이외의 정수로 나누어떨어지지 않는 정수.
    •  
  8. 다차원 배열
    • int[][] x = new int[2][4];
    • 행과 열이 존재한다.
  9. 한해의 경과 일 수를 계산하는 프로그램
    • 2차원 배열을 활용한 그 해의 경과 일수 구하기.
      import java.util.*;
      public class DayOfYear {
      
      	static int[][] mdays = {
      			{31,28,31,30,31,30,31,31,03,31,30,31},
      			{31,29,31,30,31,30,31,31,03,31,30,31} //윤년
      	};
      	
      	static int isLeap(int year) {
      		return (year %4 ==0 && year%100 !=0 || year %400 ==0) ? 1:0;
      	}
      	
      	static int dayOfYear(int y, int m, int d) {
      		int days =d;
      		
      		for(int i=1; i<m; i++) {
      			days += mdays[isLeap(y)][i-1];
      		}
      		
      		return days;
      	}
      	
      	public static void main(String[] args) {
      		Scanner sc = new Scanner(System.in);
      		
      		System.out.println("올해로 몇일이 지났을까요");
      		
      		
      			System.out.println("년: " );
      			int year = sc.nextInt();
      			System.out.println("월: " );
      			int month = sc.nextInt();
      			System.out.println("일: " );
      			int day = sc.nextInt();
      			
      			System.out.printf("올해로 %d일째 입니다. \n",dayOfYear(year, month, day));
      		
      	}
      
      }​
  10. 다차원 배열의 내부
    • 2행 4열의 배열의 선언은 다음과 같다.
      int[][] x = new int[2][4];
    • 다음과 같이 개별적으로도 수행할수 있다.
      int[][] x;
      x = new int[2][];
      x[0] = new int[4];
      x[1] = new int[4];​
    • 다차원 배열의 복제
      int[][] a = {{1,2,3,4},{5,6,7}};
      int[][] b = a.clone();
    • 위에서, 복제될때 a[0],a[1]은 복제되지만 하위배열들은 복제되지않고 공유됩니다. 즉, 양쪽에서 참조된다는 뜻입니다.

    • 확장된 for문
      int[] a = {1,2,3,4};
      int sum =0;
      
      //일반 for문
      for(int i=0; i<a.length; i++) {
      	sum += a[i];
      };
      
      //확장 for문
      for (int i :a) {
      	sum +=i;
       }​
       
       //두개는 같은 역할을 합니다!

02-2 클래스

  1. 클래스란?
    • 임의의 데이터형을 자유롭게 조합하여 만들수 있는 자료구조.
    • 클래스의 선언
      class XYZ {
      	int x; //x는 int형 필드다.
          long y; //y는 long형 필드다.
          double z; //z는 double형 필드다.
       }​
    • 클래스형 변수를 상요할때는 먼저 클래스형 변수(실체를 참조하는 변수)를 선언하고 실체인 클래스 인스턴스를 생성해야한다.
      XYZ a;		// XYZ형의 클래스형 변수 a선언
      a = new XYZ; // XYZ형의 클래스 인스턴스 생성
      
      //생성과 선언 동시에 하기
      XYZ a = new XYZ;​
       
    • 클래스형 변수a는 실체인 인스턴스를 참조하게된다.
  2. 클래스의 배열
    • 클래스형 변수a는 실체인 인스턴스를 참조하게된다.

 

교재 두잇 자료구조와 함께 배우는 알고리즘 입문(자바편) 스터디 기간 21.11.22~11.28

 

728x90
반응형

댓글