728x90

Obj. 자바가 제공하는 다양한 연산자를 학습.

  1. 산술 연산자
  2. 비트 연산자
  3. 관계 연산자
  4. 논리 연산자
  5. instanceof
  6. assignment operator
  7. 화살표 연산자
  8. 3항 연산자
  9. 연산자 우선 순위
  10. (optional) Java 13.switch 연산자

3-1 산술 연산자

수학적인 연산에 사용 할 수 있는 기호를 의미한다.

+,-,*,/,% 등이 있다.

3-2 비트 연산자

숫자를 2진수 형태로 표현하여 비트 연산을 표현한다.

& AND 두 비트가 모두 1일때 1
| OR 두 비트중 하나라도 1이 있으면 1
^ XOR 연산하는 비트가 서로 다르면 1
~ NOT 비트 반전

3-3 관계 연산자

> >= < <= == !=
크다 크거나 같다 작다 작거나 같다 같다 다르다

3-4 논리 연산자

&& AND 모두 참
|| OR 참이 하나만 있어도 참
! NOT 반전

3-5 instanceof

래퍼런스 타입 변수가 래퍼런스 타입의 데이터인지 확인하보는 연산이다.

같은 타입일 경우 true 아닐경우 false

 

3-6 assignment operator

대입 연산자 혹은 할당 연산자라고 부른다.

variable 에 literal 을 넣는 방식이 있고 시프트 연산도 존재한다.

a >> b a >>> b a << b
a를 b비트 만큼 오른쪽 이동
(빈자리는 x의 부호 비트로 채워짐)
a를 b비트 만큼 오른쪽 이동
(빈자리는 0으로 채워짐)
a를 b만큼 왼쪽으로 이동
(빈자리는 0으러 채워짐)

3-7 화살표 연산자

자바의 화살표는 람다 표현식이라고 보면 된다.

(매개변수목록) -> {함수 몸체}

 

3-8 3항 연산자

(조건) ? (조건이 참이면 실행) : (조건이 거짓이면 실행)

으로 표현

 

3-9 연산자 우선 순위

괄호를 적절하게 사용하자!

 

3-10 (optional) Java 13. switch 연산자 

일반적인 switch문과 비교해서 추가적인 기능을 할 수 있다. -> 연산도 가능하며, 멀티 케이스, 반환값이 생겼다.

자바에서 yield 표현이 생겼는데 이는 return과 비슷한 기능을 한다고 보면 된다.

 

#Reference

1. https://azderica.github.io/00-java-operation/

2. gblee1987.tistory.com/178?category=534988

3. blog.naver.com/hsm622/222138523668blog.naver.com/hsm622/222150928707

4. velog.io/@nunddu/Java-Switch-Expression-in-Java-14

728x90
728x90

Obj. 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

Todo.

  1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  2. 프리미티브 타입과 레퍼런스 타입
  3. 리터럴
  4. 변수 선언 및 초기화하는 방법
  5. 변수의 스코프와 라이프타임
  6. 타입 변환, 캐스팅 그리고 타입 프로모션
  7. 1차 및 2차 배열 선언하기
  8. 타입 추론, var

2-1 프리미티브 타입 종류와 값의 범위 그리고 기본 값

프리미티브 (Primitive) : 원시타입 혹은 기본형 타입이라고 한다. (1byte = 8 bit)

  타입 메모리크기 기본 값 표현범위
논리형 boolean 1 byte false true, false
정수형 byte 1 byte 0 -128 ~ 127
short 2 bytes 0 -32768 ~ 32767
int 4 bytes 0  -2147483648 ~ 2147483647
long 8 bytes 0L -2^63 ~2^63-1
실수형 float 4 bytes 0.0F  (3.4 X 10^-38) ~ (3.4 X 10^38) 의 근사값
double 8 bytes 0.0 (1.7 X 10^-308) ~ (1.7 X 10^308) 의 근사값
문자형 char 2 bytes '\u0000'(0을 의미)  0 ~ 65535

2-2 프리미티브 타입과 레퍼런스 타입

Primitive Type Reference Type
기본타입 참조타입
byte, short 등등 class, interface, enum, array, String
객체가 아니며 값을 저장함 주소를 저장한다.

2-3 리터럴

프로그램에서 직접 표시한 값을 의미한다. 값 그 자체로 메모리에 저장되어 있어서 변하지 않는 값 그자체를 의미한다.

2-4 변수 선언 및 초기화 하는 방법

변수 선언은 자료형 + 변수 이름을 적는다

초기화는 3가지 방법이 있다.

  • 명시적 초기화
    변수 선언과 동시에 초기화를 한다.
  • 생성자
    생성자를 만들어 초기화를 함.
  • 초기화 블럭
    복잡한 상황에서 초기화 코드를 만든다.

2-5 변수의 스코프와 라이프타임

  • 전역변수
    함수 밖에 선언되어 클래스 전체에서 사용이 가능하다
    프로그램이 종료되어야 사라짐.
  • 지역변수
    함수 안에 선언된 변수를 의미한다.
    함수가 종료되면 사라진다.

2-6 타입 변환, 캐스팅 그리고 타입 프로모션

타입변환은 변수 또는 리터럴 타입을 다른 타입으로 변환하는 것이다.

변수의 크기가 큰 것에서 작은 자료형으로 타입 변환 할때는 데이터의 손실이 발생할 수 있으므로 이를 주의해야한다.

타입 프로모션은 작은 타입에서 큰 타입으로 변환하는 것에 대한 생략이 가능한 것이다.

 

2-7 1차 및 2차 배열 선언하기

자바에서 배열선언은 간단하다.

int[] array = {1,2,3,4,5};
int[] array1 = new int[5];
int[][] array2 = {{1,2,3},{1,2,3}};
int[][] array3 = new int[row][col];

 

2-8 타입 추론, var

컴파일러가 데이터 타입이 무엇인지 추론 하는 것.

var를 사용할 때 유의할 점

  • 로컬 변수이어야 함.
  • 선언과 동시에 초기화가 되어야 한다.
  • null 초기화면 작동하지 않음
  • 람다 표현식에는 사용할 수 없다.
  • 타입이 없어서 배열에 초기값을 넘겨도 작동하지 않는다.

 

#Reference

1. https://azderica.github.io/00-java-jvm/

2. gblee1987.tistory.com/173

3. blog.naver.com/hsm622/222138523668

728x90
728x90

https://www.acmicpc.net/problem/2560

 

2560번: 짚신벌레

첫째 줄에 a, b, d, N을 나타내는 네 정수가 빈칸 하나를 사이에 두고 차례로 주어진다. 단, 0<a<b<d≤10,000이고, 1≤N≤1,000,000이다.

www.acmicpc.net

 

문제

한 생물학자가 새로 발견된 짚신벌레 종의 생태에 대해 연구하고 있다. 매우 번식력이 강하다고 알려진 이 종은 아래와 같은 특징을 가지고 있다.

 

무성 생식을 한다.

 

태어난 이후 a일째 되는 날 성체가 된다.

 

성체가 된 날부터 매일 한 마리씩 새로운 개체를 만들어낸다: 성체가 되자마자 첫 개체를 만들어내고, 그 이후로 하루가 지날 때마다 새로운 개체를 하나씩 만들어낸다. 새로운 개체 역시 태어난 이후로 a일째 되는 날부터 성체가 되어 새로운 개체를 만든다.

 

태어난 이후로 b일째 되는 순간부터는 새로운 개체를 더 이상 만들지 않는다. 태어난 지 a일째 날부터 b일째 되는 날의 전날까지 새로운 개체를 만들어내므로 일생동안 총 b-a 마리의 개체를 만들어낸다.

 

태어난 이후로 d일째 되는 순간 죽는다.

 

아래는 a=2, b=4, d=6일 때 수조에 새로 태어난 짚신벌레 한 마리를 넣고 매일 관찰한 결과를 기록한 것이다. 괄호 안의 숫자들은 수조 안의 짚신벌레들이 각각 태어난 이후 며칠이 되었는지를 나타내는 정수이다.

 

태어난 날: (0) - 새로운 개체를 집어넣음

 

1일째 되는 날: (1) - 짚신벌레가 자람

 

2일째 되는 날: (2, 0) - 짚신벌레가 태어난 지 2일째가 되므로 성체가 되고 새 개체를 만들어 냄

 

3일째 되는 날: (3, 1, 0) - 2일째 성체가 된 짚신벌레가 오늘도 새 개체를 하나 만들어 냄

 

4일 째 되는 날: (4, 2, 1, 0) - 2일째 되는 날 만들어진 짚신벌레가 새로운 개체를 만들어 냄 (처음에 넣은 짚신벌레는 새 개체를 만들어내지 못함)

 

5일 째 되는 날: (5, 3, 2, 1, 0, 0)

 

6일 째 되는 날: (4, 3, 2, 1, 1, 0, 0) - 처음에 넣은 개체는 죽는다.

 

6일 째 되는 날 수조안에 살아있는 짚신벌레는 총 7마리가 된다.

 

짚신벌레의 번식 정보 a, b, d에 대하여, 새로 태어난 짚신벌레 한 마리를 수조 안에 넣은 이후 N일째 되는 날 살아있는 짚신벌레 수를 1000으로 나눈 나머지를 출력하는 프로그램을 작성하시오.



별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음 줄로 내려갈 수 있는 위치이며, 빨간 가위표는 원룡이가 내려갈 수 없는 위치가 된다. 숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오. 점수는 원룡이가 위치한 곳의 수의 합이다.

 

입력

첫째 줄에 a, b, d, N을 나타내는 네 정수가 빈칸 하나를 사이에 두고 차례로 주어진다. 단, 0<a<b<d≤10,000이고, 1≤N≤1,000,000이다.

 

출력

첫째 줄에, 수조에 짚신벌레 한 마리를 넣은 지 N일째 되는 날 수조에 살아 있는 짚신벌레의 수를 1000으로 나눈 나머지를 출력한다.

 

풀이

a일 부터 무성생식이 가능하므로 a까지는 1마리로 유지된다. 이후로 b일까지 생식을 진행하므로 계속 증가한다. 이때 b일 전까지의 벌레의 마리수는 전날 + 오늘 새로 태어난 벌레의 수이다. 그래서  dp[i] = dp[i-1] + dp[i-a] 이다. 

오늘 태어난 벌레의 수는 오늘 부터 a일 전에 있던 벌레의 수이다.

 

하지만 b일 이후에는 더이상 생식을 하지 않기에 b일 이후의 벌레는 dp[i] = dp[i - 1] + dp[i - a] - dp[i - b] 이다. 이렇듯 더이상 생식을 하지 않은 벌레 수를 빼주면서 더해간다.

 

그리고 d일 이후에는 죽은 벌레의 수를 빼주면 된다.

 

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

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int start = Integer.parseInt(st.nextToken());
        int end = Integer.parseInt(st.nextToken());
        int death = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        int[] dp = new int[N+1];
        dp[0] = 1;

        for (int i = 1; i <= N; i++) {
            if (i<start) // 시작날 전까지 유지됨.
                dp[i] = dp[i-1]%1000;
            else if(i<end) // 단순하게 증가함! 전날 + 새로 태어남
                dp[i] = (dp[i-1] + dp[i-start])%1000;
            else
                dp[i] = (dp[i-1]+dp[i-start]-dp[i-end]+1000)%1000;
        }

        if(N-death>=0)
            System.out.println((dp[N]-dp[N-death]+1000)%1000);
            
        else System.out.println(dp[N]%1000);

    }
}

 

728x90
728x90
 

2096번: 내려가기

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

문제

N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다.

먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다.

별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음 줄로 내려갈 수 있는 위치이며, 빨간 가위표는 원룡이가 내려갈 수 없는 위치가 된다. 숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오. 점수는 원룡이가 위치한 곳의 수의 합이다.

입력

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

출력

첫째 줄에 얻을 수 있는 최대 점수와 최소 점수를 띄어서 출력한다.

 

풀이

이 문제는 DP문제로 시간이 1초임을 유의해서 풀어야 한다.

단순한 아이디어로 풀수 있는 문제이다.

 

왼쪽 끝과 오른쪽 끝은 내려갈 수 있는 곳이 2곳으로 한정되어 있고, 중간은 세 곳 모두 갈 수 있으므로 연산을 최대와 최소만 찾아서 구해주면 답은 나온다.

 

괜히 이 방법이 아닐까봐 다른 방법을 생각해보다가 시간이 오래 걸렸다.

 

 

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

public class Main {
    static int N;
    public static void main(String[] args) throws IOException {
    
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(bf.readLine());
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int[] input = new int[3];
        int[][] dp = new int[N][6];
        
        for (int i = 0; i < 3; i++)
            input[i] = Integer.parseInt(st.nextToken());
       
       for (int i = 0; i < 3; i++) 
            dp[0][3 + i] = dp[0][i] = input[i];
        

        for (int k = 1; k < N; k++) {
        
            st = new StringTokenizer(bf.readLine());
            
            for (int j = 0; j < 3; j++)
                input[j] = Integer.parseInt(st.nextToken());
                
            int i = k-1;
            
            dp[k][0] = Integer.min(dp[i][0], dp[i][1]) + input[0];
            dp[k][1] = Integer.min(dp[i][0], Integer.min(dp[i][1], dp[i][2])) + input[1];
            dp[k][2] = Integer.min(dp[i][1], dp[i][2]) + input[2];

            dp[k][3] = Integer.max(dp[i][3], dp[i][4]) + input[0];
            dp[k][4] = Integer.max(dp[i][3], Integer.max(dp[i][4], dp[i][5])) + input[1];
            dp[k][5] = Integer.max(dp[i][4], dp[i][5]) + input[2];
        }

        Arrays.sort(dp[N-1]);
        System.out.printf("%d %d",dp[N-1][5],dp[N-1][0]);

    }
}
728x90
728x90
 

10868번: 최솟값

N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는

www.acmicpc.net

문제

N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는 어려운 문제가 된다. 이 문제를 해결해 보자.

여기서 a번째라는 것은 입력되는 순서로 a번째라는 이야기이다. 예를 들어 a=1, b=3이라면 입력된 순서대로 1번, 2번, 3번 정수 중에서 최솟값을 찾아야 한다. 각각의 정수들은 1이상 1,000,000,000이하의 값을 갖는다.

입력

첫째 줄에 N, M이 주어진다. 다음 N개의 줄에는 N개의 정수가 주어진다. 다음 M개의 줄에는 a, b의 쌍이 주어진다.

출력

M개의 줄에 입력받은 순서대로 각 a, b에 대한 답을 출력한다.

 

 

풀이.

이 문제는 Segment-Tree와 관련된 문제이다. 기본 세그먼트 트리를 기반으로 했을 때 주요 문제의 포인트는 단말 노드가 아닌 노드들은 모두 가장 작은 값을 올려 두는 것이다. 이를 제외한다면 기본 세그먼트 트리의 기본문제와 동일하다.

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    static long[] arr,tree;
        
    public static void main(String[] args) throws IOException {
    
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        arr = new long[N+1];
        tree = new long[4*N];

        for (int i = 0; i < N; i++) 
            arr[i] = Integer.parseInt(bf.readLine());
        
        
        initTree(0,N-1,1);

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(bf.readLine());
            bw.write(searchTree(0,N-1,1,Integer.parseInt(st.nextToken())-1,Integer.parseInt(st.nextToken())-1)+"\n");
        }
        
        bw.close();
        
    }
    
    public static long initTree(int start, int end, int index){//세그먼트 트리를 만드는 함수
        
        if(start == end)
            return  tree[index] = arr[start];
            
        else{
            int mid = (start+end)/2;
            return tree[index] = Long.min(initTree(start,mid,index*2), initTree(mid+1,end,index*2+1));
        }
    }
    
    public static long searchTree(int start, int end, int index, int left, int right){
    //세그먼트 트리 탐색 함수
      
      	if(start > right || end < left)
            return Integer.MAX_VALUE;
        
        if(start>=left && end <= right)
            return tree[index];
        
        int mid = (start + end)/2;

        return Long.min(searchTree(start,mid,index*2,left,right), searchTree(mid+1,end,index*2+1,left,right));

    }
}

 

728x90
728x90

Obj. 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

Todo.

  1. JVM이란 무엇인가?
  2. 컴파일 하는 방법.
  3. 실행하는 방법.
  4. 바이트 코드란 무엇인가?
  5. JIT 컴파일러란 무엇이며 어떻게 동작하는지?
  6. JVM 구성요소
  7. JDK와 JRE의 차이

1-1 JVM이란 무엇인가?

-> JVM은 Java Virtual Machine의 줄임말로 자바 가상 머신을 의미하며 다양한 OS에 있어서 관계없이 java 코드를 실행할 수 있도록 하는 것이며 GC(Garbage Collection)등의 기능을 제공하는 것이다.

 

1-2 컴파일 하는 방법

컴파일 이란? .java 파일을 .class파일로 변환하는 과정을 의미한다.

기본적으로 cmd에서 "javac" 명령어를 통해 사용한다. 여기서 여러 옵션이 있으니 찾아보면 좋을 듯하다.

1-3 실행하는 방법.

실행하는 방법은 "java" 명령어를 사용하여 class 파일을 실행시킨다.

1-4 바이트 코드란 무엇인가

프로그램을 실행하기 위해서 JVM이 이해할 수 있는 형태로 번역을 해서 전해줘야 한다. 일반적으로 java 파일은 단지 확장자가 java인 Text파일 이므로 자바 컴파일러로 변화되는 코드의 명령어 크기가 1바이트라서 바이트코드라고 한다고 함.

1-5 JIT 컴파일러란 무엇이며 어떻게 동작하는지?

JIT : Just In Time 컴파일러로 바이트 코드를 기계어로 번역하는 것을 의미한다. 기본적으로 인터프리터 방식은 바이트코드를 한 줄씩 읽으면서 코드를 실행시키기에 동일한 메소드를 중복 실행 시키는 비효율이 있기에 JIT는 런타임시 바이트 코드를 네이티브 기계어로 한번에 컴파일 후에 캐싱을 통해 사용한다.

1-6 JVM 구성요소

JVM 구조

JVM의 구조

  • Class Loader(클래스 로더)
    • JVM내로 클래스를 로드하고 링크를 통해 배치한다. 실행시 동적으로 클래스를 로드하며 사용하지 않는 클래스는 메모리에서 제거함.
  • Execution Engine(실행 엔진)
    • 클래스 로더에서 분석된 클래스 파일의 데이터를 저장하고 실행 도중에 필요한 데이터를 저장하고 실행 도중에 필요한 데이터를 실행
    • Interpreter, JIT Compiler, Garbage Collector 등이 있음.
  • Runtime Data Area
    • 5가지 영역으로 나뉜다
      1. Method 영역 : 모든 클래스 레벨의 데이터는 이곳에 저장된다. JVM은 오직 하나의 메서드 영역만 가지고 자원을 공유한다.
      2. Heap 영역 : 모든 objects들과 인스턴스 변수, 배열은 이곳에 저장된다. 이 또한 하나의 힙 영역만 가지고 있음.
      3. Stack 영역 : 모든 스레드에 대하여 저장이 되고 메서드가 종료되면 공간에서 삭제된다.
      4. PC 레지스터
      5. Native Method 스택

1-7 JDK와 JRE의 차이

JDK : Java Development Kit

JRE : Java Runtime Environment

의 차이로 JRE는 JVM과 클래스 라이브러리와 같이 실행환경을 의미하고,  JDK는 JRE와 함께 개발에 필요한 SW를 모아둔 것이다.

 

#Reference

1. adnjavainterview.blogspot.com/2017/04/java-vertual-machinejvm-architecture-in.html

2. https://azderica.github.io/00-java-jvm/

3. gblee1987.tistory.com/173

4. blog.naver.com/hsm622/222138523668

728x90
728x90

패턴 매칭 알고리즘 중

  1. 부르트 포스 방법.
    첫글자 부터 맞는지 확인 하는 방법
int pattern_find(char *string, char *pat)
{ /* match from the beginning of pattern */
    int k, j, start = 0;
    int lasts = strlen(string)-1;
    int lastp = strlen(pat)-1;

    for (k = 0; k <= lasts - lastp; k++) {
        for (j = 0; j <= lastp; j++)
            if (string[k+j] != pat[j]) break; // k+j == i의 의미로 해석하자
        if ( j == lastp+1) return k; /* pattern start index in string */
    }
    return -1; /* not found */
}
  1. N-find

int nfind(char *string, char *pat)
{ /* match the last character of pattern first, and then match from the beginning */
    int i, j, start = 0;
    int lasts = strlen(string)-1;
    int lastp = strlen(pat)-1;
    int endmatch = lastp;

    for (i = 0; endmatch <= lasts; endmatch++, start++) {
        if (string[endmatch] == pat[lastp]) {
            for (j = 0, i = start; j < lastp && string[i] == pat[j]; i++,j++);
            if ( j == lastp) return start; /* successful */
        }
    }
    return -1;
}
  1. KMP
int pmatch(char *string, char *pattern)
{ /* Knuth, Morris, Pratt string matching algorithm */
    int s = 0, p = 0;
    int length_str= strlen(string);
    int length_pat = strlen(pattern);

    while ( s < length_str && p < length_pat ) {
        if (string[s] == pattern[p]) { s++; p++; }
            else {
                    if (p == 0) s++;
                    else p = failure[p-1]+1;
            }
     }
        return ( (p == length_pat) ? (s-length_pat), -1);
}

위 코드를 쓰기 위해서는 Failure 함수를 써야함 -> 패턴을 찾아야 함

void fail(char *pat)
{
  int s, m, length = strlen(pat);
  failure[0] = -1;
      for (s=1; s < length; s++) {
  // decide failure[s]; (어디까지 최대로 같은가)
          m = failure[s-1]; // 바로 앞은 m 까지 같았다.
          while ((m>=0) && (pat[m+1] != pat[s]))
              m = failure[m];
          if (pat[m+1] == pat[s]) failure[s] = m+1;
          else failure[s] = -1;
      }    
}
728x90

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

[Data Structure] basic concepts  (0) 2021.01.04
728x90

자료구조

프로그램(Software) = Data Structures + Algorithms is authored by Niklaus Wirth

Data Structure
데이터를 저장하거나 조직하는 특정한 방법, 논리적이나 수학적인 모델을 사용한다. (Array, Linked-List, Stack, Queue, Hash, Tree)

Algorithms
문제를 해결하기 위한 방법. 특정한 일을 수행하는 유한 집합. (Sort, Search, Numerical, Geometric, Greedy)

시스템 생명 주기

  • 요구
    프로젝트의 목적을 명시하고, Input과 Output을 명시한다.
  • 분석
    관리 가능한 문제로 분할 한다. 2가지 방식이 있는데, Bottom-Up & Top-Down 중 Top-Down을 사용함.
  • 설계
    데이터 구조(Abstract Data Type), 알고리즘 , 언어 의존성
  • 정제 및 코딩
    데이터 객체의 표현, 각각의 연산에 대한 알고리즘 작성
  • 검증
    정확도 증명, 테스팅, 에러제거

Algorithm Specification

알고리즘은 특정한 일을 하는 명령의 유한 집합이다. 모든 알고리즘은 다음과 같은 5가지를 명세해야함.

  • Input
    There are zero or more quantities that are externally supplied.
  • Output
    At least one quantity is produced.
  • Definiteness
    Each instruction is clear and unambiguous.
  • Finiteness
    If we trace out the instructions of an algorithm, then for all cases, the algorithm terminates after a finite number of steps.
  • Effectiveness
    Every instruction must be basic enough to be carried out, in principle, by a person using only pencil and paper

추상 자료형(Abstract Data Type)

: (객체들의 명세 + 그 객체들에 작용하는 연산들의 명세)을 함께 선언하며, 그 선언이 (그 객체들의 표현 + 그 연산들 의 구현)과는 분리되어 있는 것.

" ::= " 표기는 "is defined as" 로 읽으면 됨.

Performance Analysis

  • 성능 분석(Performance Analysis)
    기기와 무관하게 시간과 공간을 예측하는 것.
  • 성능 측정(Performance Measurement)
    기기와 관련하여 실행 시간을 분석 하는 것.
  • 공간 복잡도(Space Complexity)
    수행하는데 필요한 메모리의 크기
  • 시간 복잡도(Time Complexity)
    수행하는데 필요한 연산 시간

공간 복잡도(Space Complexity) S(P) = c + S_P(I)

  1. Fixed space requirements (denoted by c)
  2. Variable space requirements (denoted by S_P(I))

시간 복잡도(Time Complexity) T(P) = c + Tp(n)

c : 컴파일 시간, Tp : 실행 시간, n : instance characteristics

728x90

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

KMP 알고리즘  (0) 2021.01.05

+ Recent posts