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 [인생의 로그캣:티스토리]