직렬화 - 역직렬화? 직렬화(Serialization)는 자바 객체를 파일, 디비, 메모리 등 외부 시스템과 통신할 수 있도록 바이트 상태인 데이터로 변환하는 것을 의미하며, 반대로 바이트 상태인 데이터를 객체로 변환하는 것을 역직렬화(De-Serialization)라고 합니다. 외부 시스템과 통신하기 위해 바이트로 변환하는 이유는 뭘까? 자체 메모리 위에서만 통신한다면 JVM 힙 영역에 있는 주솟값으로 객체를 주고받을 수 있다. 하지만 외부 시스템과 통신하기 위해선 주솟값은 의미 없기 때문에 실제 값을 전송하기 위한 스트림 통로와 바이트 변환이 필요하게 된다. Primitive 타입은 실제 값을 가지고 있기 때문에 직렬화하지 않아도 된다. Serializable public interface Seria..
문자열 패턴 매칭 라빈-카프 알고리즘 문자열 검색을 위해 해시 값 함수와 슬라이딩 윈도우 기법을 사용 문자열을 mod 연산을 통해 해쉬값 취환 문자를 일일이 비교하지만 해시를 사용하므로 최악은 O(MN) 이지만 선형적일수록 효율적이다. (단, 해쉬 충돌 여지가 있다.) 보이어 무어 알고리즘 문자열을 오른쪽에서 왼쪽으로 비교 끝 문자가 비교 문자랑 다르다면 끝 문자가 패턴에 포함되어 있는지 확인하고, 있다면 그 길이만큼 이동, 없다면 패턴의 길이 만큼 이동 최악은 O(MN) 이지만 최선은 O(N/M)이며 평균적으로 높은 속도를 가지는 알고리즘 skip 배열 skip 횟수를 저장한 배열 - 뒤로 갈 수 있는 거리 만큼 배열에 저장 패턴이 "rithm" 이라면 패턴의 길이는 5이다. a~z 중 r =4, i=..
서로소 집합 (Disjoint-set) 서로소 또는 상호배타 집합들은 서로 중복 포함된 원소가 없는 집합들 (교집합 X) 집합에 속한 하나의 특정 멤버를 통해 각 집합을 구분 (대표자) 연결 리스트 또는 트리로 서로소 집합을 표현 Make-Set(x) p[x] 175 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class MST1_KruskalTest { static class Edge implements Comparable{ int from, to, weight..
그래프 선형 자료구조나 트리 자료구조로 표현하기 어려운 N:M 관계를 가지는 원소를 표현하는데 용이 정점 (Vertex) : 그래프의 구성요소로 하나의 연결점 간선 (Edge) : 두 정점을 연결하는 선 차수 (Degree) : 정점에 연결된 간서의 수 양방향 그래프 (최대 V * (V-1) / 2 개의 간선) 단반향 그래프 (최대 V * (V-1) 개의 간선) 인접 행렬 두 정점을 연결하는 간선의 유무를 행렬로 표현 V x V 정방 행렬 행번호와 열 번호는 그래프의 정점에 대응 두 정점이 인접되어 있으면(또는 가중치) 1 그렇지 않으면 0으로 표현 무향 그래프 : i번째 행의 합 = i번째 열의 합 = Vi의 차수 유향 그래프 : 행 i의 합 = Vi의 진출 차수, 열 i의 합 = Vi의 진입 차수 희..
완전 검색 순열(Permutation) 서로 다른 n개 중 r개를 선택하는 과정에서 순서가 의미가 있는 경우 - nPr 예 ) 5개의 도시 중 출발지와 도착지가 같은 최소 비용 거리 반복문 // {1, 2, 3}을 포함한 모든 순열 생성 : 3P3 // 동작 과정 1. 1~3 수 선택 시도, 2. 중복 수 필터링, 3. 다음 자릿수 선택 - 선택 이후 1,2,3 반복 for i from 1 to 3 // 처음 수 선택 for j from 1 to 3 // 두번째 수 선택 if j != i then // 첫번째와 두번째가 다르다면 for k from 1 to 3 // 세번 째 수 선택 if k != i and k != j then // 세번째 수가 첫번째, 두번째와 다른 경우 print i,j,k // 세..
객체 지향 OOP is A PIE Abstraction (추상화) : 현실 객체를 추상화해서 클래스를 구성 Polymorphism(다형성) : 하나의 객체를 여러 가지 타입으로 참조 (메서드 다형성, 타입 다형성) Inheritance(상속) : 부모 클래스를 물려받아 자식이 재정의 Encapsulation(캡슐화) : 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해 보호 Type Primitive Type (기본형) 미리 정해진 크기의 Memory Size로 표현 변수 자체에 값 저장 long 보다 더 큰 값을 표현하고 싶을 땐 무한대에 가까운 BigInteger를 사용한다. Reference Type(참조형) 크기가 미리 정해질 수 없는 데이터의 표현 변수에는 실제 값을 참조할 수 있는 주소만 ..
Security 보안 정책 (Policy) H/W 보안 (칩 등) S/W 보안 (보안 솔루션) 운영체제 네트워크 솔루션 프로그래밍 (보안 모듈, 리버스 엔지니어링(역공학)) Java Security 메시지를 주고받을 때 (같은 프로그램, 즉 같은 알고리즘 사용) 송신 : 암호화(Ciphertext + key)하여 송신 수신 : 받은 정보를 복호화하여 수신 공개키 : 암호화로 할때 사용한 키가 있어야 복호화가 가능한 방식 DES : 1977년 IBM에 의해 개발, 현재 기술론 충분히 해킹 가능 (64비트 text, 54비트의 키, 16rounds를 통한 암호화) AES(블록 알고리즘) : DES의 문제를 개선 - 128,193,256비트 등과 같은 가변적 비트길이, 키를 갖고 있어 복잡한 암호화된 결과물을..
DFS 합이 같은 부분 집합 import java.util.*; public class Main { static int n, total =0; static String answer ="NO"; boolean flag = false; public void dfs(int level, int sum, int[] arr) { if (flag) return; if (sum > total / 2) return; if (level == n) { if ((total-sum)==sum) { answer="YES"; flag = true; } } else { dfs(level+1, sum+arr[level], arr); dfs(level+1, sum, arr); } } public static void main(Strin..