알고리즘
소수 찾기
소수란? : 1과 자기 자신 외에 나누어떨어지는게 없는 수
소수를 판별 하는 법
1.
n이란 수가 있으면 n을 2부터 n-1까지 나누어 보는 방법 O(N)
2.
n/2 미만까지 n을 n/2까지 나누어 보는 방법 O(N)
3.
루트 n 까지(포함) 나누어 보는 방법 EX) √29 는 5.xx이므로 5 이하의 정수로만 나눠서 확인
1번 방법
public boolean isPrime(int num){
// 1. n이란 수가 있으면 n을 2부터 n-1까지 나누어 보는 방법 O(N)
// 2부터 자기 자신 전까지 나누어 떨어지는지 반복해서 나눠본다
for (int i = 2; i < num; i++) {
if(num%i == 0){
return false;
}
}
return true;
}
Java
복사
2번 방법
public boolean isPrime2(int num){
//2. n/2해서 소수 구하기
for (int i = 2; i < num/2; i++) {
if(num%i == 0){
return false;
}
}
return true;
}
Java
복사
3번 방법
public boolean isPrime3(int num){
//3.루트 사용해서 소수 구하기
for (int i = 2; i * i < num; i++) {
if(num%i == 0){
return false;
}
}
return true;
}
Java
복사
Template Callback 적용
사용 이유 : 변화되는 부분을 매번 클래스로 만들지 않고 , 내부 클래스를 바로 생성하여 이용한다.
(i < num, i < num/2, i * i <= num 같은 특정 부분만 바뀌기 때문에 논리 연산 하는 부분을 함수로 분리한다)
Template Callback 적용
public class TemplateCallbackPrime {
//Template Callback
boolean someOperation(int a, int b) {
return a < b;
}
boolean isPrime(int num) {
//i<num을 someOperation 함수에서 return
for (int i = 2; someOperation(i, num); i++) {
if(num % i == 0) return false;
}
return true;
}
Java
복사
StatementStrategy 적용
interface StatementStrategy{
//인터페이스 사용
boolean compare(int a , int b);
}
boolean isPrime(int num,StatementStrategy stmt){
for (int i = 2; stmt.compare(i,num); i++) {
if(num%i == 0) return false;
}
return true;
}
Java
복사
익명 내부 클래스 사용
public class TemplateCallbackPrime {
boolean isPrime(int num, StatementStrategy stmt) {
for (int i = 2; stmt.compare(i, num); i++) {
System.out.println(i);
if(num%i == 0) return false;
}
return true;
}
Java
복사
DB에 Insert하기
HospitalDao
@Component
public class HospitalDao {
//요즘에는 @Autowired를 쓰는것 보다 private final 로 사용한다.
private final JdbcTemplate jdbcTemplate;
public HospitalDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
Java
복사
HospitalDao - add()
Insert 구문을 작성하여 Value 값을 Mapping 해준다
Alter 테이블을 하여 데이터 타입과 크기를 변경한다.
Alter 테이블을 할때 타입 변경시 주의
float → int
10.1 → 10 , 0.2 → 0
int → float
10 → 10.0
0 → 0.0
Table Data Export Wizard 클릭 → Next 반복클릭!
Architecture 구조
SpringBoot
•
@SpringBootApplication → @ComponentScan @Component, @Configuration, @Service, @Repository 등이 붙어있는 클래스를 Bean으로 등록 해줘서 HopitalDao는 Factory가 없어도 DI 적용
•
테스트 코드에 test.java에 코드가 있다 - HospitalParserTest 클래스에 @SpringBootTest 를 안붙이면 안돌아간다.
•
@SpringBootTest 는 모든 빈들을 스캔하고 애플리케이션 컨텍스트를 생성하여 테스트를 실행한다.
•
@ComponentScan 은 @SpringBootApplication 이 붙은 클래스 이하에 있는 모든 패키지를 스캔해서 @Component, @Configuration, @Service, @Repository 등이 붙어있는 클래스를 빈으로 등록 한다.
deleteAll(), getCount()
public void deleteAll(){
this.jdbcTemplate.update("delete from nation_wide_hospitals");
}
public int getCount(){
String sql = "SELECT count(id) FROM likelion.nation_wide_hospitals";
return this.jdbcTemplate.queryForObject(sql,Integer.class);
}
Java
복사
Test 코드
1.
hospital 테이블을 삭제한다.
2.
테이블에 데이터의 개수가 0개인지 확인한다.
3.
line1을 정제하고 insert 한다.
4.
테이블에 데이터의 개수가 1개인지 확인한다.
String line1 = "\"1\",\"의원\",\"01_01_02_P\",\"3620000\",\"PHMA119993620020041100004\",\"19990612\",\"\",\"01\",\"영업/정상\",\"13\",\"영업중\",\"\",\"\",\"\",\"\",\"062-515-2875\",\"\",\"500881\",\"광주광역시 북구 풍향동 565번지 4호 3층\",\"광주광역시 북구 동문대로 24, 3층 (풍향동)\",\"61205\",\"효치과의원\",\"20211115113642\",\"U\",\"2021-11-17 02:40:00.0\",\"치과의원\",\"192630.735112\",\"185314.617632\",\"치과의원\",\"1\",\"0\",\"0\",\"52.29\",\"401\",\"치과\",\"\",\"\",\"\",\"0\",\"0\",\"\",\"\",\"0\",\"\"";
@Test
@DisplayName("Hospital이 insert가 잘 되는지")
void add(){
hospitalDao.deleteAll();
assertEquals(0,hospitalDao.getCount());
HospitalParser hp = new HospitalParser();
Hospital hospital = hp.parse(line1);
hospitalDao.add(hospital);
assertEquals(1,hospitalDao.getCount());
Java
복사
findById() , RowMapper