///////
Search

알고리즘,DB_이연재

1. 알고리즘

1. 코드업 2081번

코드

2. 코드업 4596번

코드

3. 다형성을 적용해 최대,최소값 구하기

interface Compare { boolean doSomething(int valueA, int valueB); } public class MaxAndMin { private int getMaxOrMin(int[] arr, Compare compare) { // callback //loop 구성 int targetValue = arr[0]; // arr이 모두 음수인 경우 0으로 하면 0이 max for (int i = 1; i < arr.length; i++) { boolean isSth = compare.doSomething(arr[i], targetValue); // max인 경우 arr[i] > targetValue // min인 경우 arr[i] < targetValue if (isSth) { targetValue = arr[i]; } } return targetValue; } public int max(int[] arr) { return getMaxOrMin(arr, new Compare() { @Override public boolean doSomething(int valueA, int valueB) { return valueA > valueB; } }); } public int min(int[] arr) { return getMaxOrMin(arr, new Compare() { @Override public boolean doSomething(int valueA, int valueB) { return valueA < valueB; } }); } public static void main(String[] args) { int[] arr = new int[]{3, 29, 38, 12, 57, 74, 40, 85, 61}; MaxAndMin maxAndMin = new MaxAndMin(); int maxResult = maxAndMin.max(arr); int minResult = maxAndMin.min(arr); System.out.println(maxResult); System.out.println(minResult); } }
Java
복사
min과 max가 따로 메소드를 구성할 경우 index 추가등 여러 기능을 넣게 되면 모두 바꿔줘야 하기 때문에 번거롭다.
interface와 callback을 이용해서 boolean 을 리턴한다.
위 코드에선 Template Callback패턴을 이용했다.
Template Callback패턴1) Template Method(private)클래스 안에서만 호출되는 Template을 만든다.2) public -max(), min()메소드에서 Template Method를 호출 한다.3) 바뀐 부분만 내부 클래스로 구현해서 parameter로 넘긴다.4) interface를 선언한다.

4. 빅 오(big-O) 표기법

1. 빅오 표기법이란?

알고리즘의 효율성을 표기해주는 표기법이다.
알고리즘의 시간 복잡도와 공간 복잡도를 나타내는데 주로 사용 된다.

2. 빅오 표기법의 특징

1) 상수항 무시
빅오 표기법에선 N이 충분히 크다고 가정하기 때문에 상수항은 무시한다
예시) O(2N) -> O(N)
2) 영향력 없는 항 무시
상수항 무시와 같이 N이 충분히 크다고 가정하기 때문에 영향력 없는 항또한 무시한다.
예시) O(2N^2+3N+1) -> O(N^2)

3. 빅오 표기법 예제

1) O(1) : 스택에서 Push, Pop
2) O(log N) : 이진트리
3) O(N) : for 문
4) O(Nlog N) : 퀵 정렬(quick sort), 병합정렬(merge sort), 힙 정렬(heap Sort)
5) O(N^2): 이중 for 문, 삽입정렬(insertion sort), 버블정렬(bubble sort), 선택정렬(selection sort)
6) O(2^N) : 피보나치 수열

2. SQL Insert하는 스크립트 만들기

0. 데이터 정보

데이터는 공공데이터로 서울시 병의원 위치 정보.csv파일이다.
19040건의 데이터가 들어있다.
다음과 같은 데이터를 얻을 수 있다.1) 병원분류명이 총 몇가지 일까?2) 병원분류별로 몇개씩 있을까? ex)의원:x개, 치과병원:y개 ...3) 병원 분류가 몇가지 일까?4) 서울의 구별로 각 병원이 몇개 있을까?5) 구별로 병원이 가장 많은 구는 어디일까?6) 이비인후과, 외과, 내과, 소아과, 피부과, 성형외과 는 각 몇개일까?

1. 논리적 설계

테이블 정의서를 작성하는 단계이다.

2. 물리적 설계

1. Table 생성

2. 직접 INSERT하기

Entity(Table) seoul_hospital에 1개 Row(Record) Insert한다.
INSERT INTO `likelion-db`.`seoul_hospital` (`id`, `address`, `district`, `category`, `emergency_room`, `name`, `subdivision`) VALUES ('A1120837', '서울특별시 금천구 벚꽃로 286 삼성리더스타워 111~114호 (가산동)', '서울특별시 금천구', 'C', 2, '가산기대찬의원', null);
SQL
복사

3. 파일로 INSERT하기

1) 파일에 sql문을 작성한다.
2) .sql로 스크립트 파일을 저장한다.
3) Workbench에서 .sql 스크립트를 불러온다.
4) 불러온 .sql 스크립트를 실행한다.
INSERT INTO 작성할 때 팁- insert into를 한번만 써도 values에 여러개 넣을 수 있다.
ex)
INSERT INTO `likelion-db`.`seoul_hospital`(`id`,`address`,`district`,`category`,`emergency_room`,`name`,`subdivision`) VALUES ('B1100027','서울특별시 강남구 도산대로 118 (논현동 신사빌딩 2층) ','서울특별시 강남구','C',2,'365엠씨의원',null), ('A1117873','서울특별시 강남구 도산대로 118 (논현동 신사빌딩 2층) ','서울특별시 강남구','C',2,'365엠씨의원',null) ;
SQL
복사

3. Java로 SQL 파일 만들기

0) Gradle Build로 프로젝트생성
1) .csv에서 라인별로 읽어오기
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class LineReader { List<String> readLines(String filename) throws IOException { List<String> result = new ArrayList<>(); BufferedReader br = new BufferedReader(new FileReader(filename)); String str; while ((str = br.readLine()) != null) { result.add(str); } return result; } public static void main(String[] args) throws IOException { String filename = "./서울시 병의원 위치 정보.csv"; LineReader lr = new LineReader(); List<String> lines = lr.readLines(filename); System.out.println(lines.size()); } }
Java
복사
2) 다형성을 적용해서 Parser 만들기
public interface Parser<T> { T parse(String str); }
Java
복사
public class HospitalParser implements Parser<Hospital>{ @Override public Hospital parse(String str) { String[] splitted = str.split(","); return new Hospital(splitted[0]); } }
Java
복사
public class Hospital { private String id; private String address; private String district; private String category; private Integer emergencyRoom; // snake camel private String name; // snake camel private String subdivision; // snake camel public Hospital(String id) { this.id = id; } public String getId() { return id; } }
Java
복사
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class LineReader<T> { Parser<T> parser; boolean isRemoveColumnName = true; public LineReader(Parser<T> parser) { this.parser = parser; } public LineReader(Parser<T> parser, boolean isRemoveColumnName) { this.parser = parser; this.isRemoveColumnName = isRemoveColumnName; } List<T> readLines(String filename) throws IOException { List<T> result = new ArrayList<>(); BufferedReader br = new BufferedReader(new FileReader(filename)); String str; if (isRemoveColumnName) { br.readLine(); } while ((str = br.readLine()) != null) { result.add(parser.parse(str)); } return result; } }
Java
복사
import java.io.IOException; import java.util.List; public class Main { public static void main(String[] args) throws IOException { LineReader<Hospital> hospitalLineReader = new LineReader<>(new HospitalParser()); String filename = "./서울시 병의원 위치 정보.csv"; List<Hospital> hospitals = hospitalLineReader.readLines(filename); System.out.println(hospitals.size()); for (Hospital hospital : hospitals) { System.out.println(hospital.getId()); } } }
Java
복사

3. Reference

https://noahlogs.tistory.com/27 [인생의 로그캣:티스토리]