///////
Search

알고리즘,DB_조문주

알고리즘

문제 1) codeup 2081 : 최대값 I

문제 설명 9개의 서로 다른 자연수가 주어질 때, 이들 중 최대값을 찾고 그 최대값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
Plain Text
복사
public class Max01 { public static void main(String[] args) { // 주어진 배열 안에서 최대값 구하기 // 배열 선언 int[] arr = new int[]{3, 29, 38, 12, 57, 74, 40, 85, 61}; // loop 구성 (전체 순회) _ 이런 문제들은 한번 싹 출력해보는게 좋음 // 비교할 변수 선언 int maxValue = 0; for(int i = 0; i < arr.length; i++){ if(arr[i] > maxValue){ maxValue = arr[i]; } } } }
Java
복사
문제점: maxValue를 0으로 초기화했을 때, 배열의 값이 모두 음수인 경우 0이 max가 된다
// 수정 코드 public class Max02 { public int[] getMax(int[] arr){ // loop 구성 int maxIdx = 0; int maxValue = arr[0]; for(int i = 1; i < arr.length; i++){ // i를 1로 초기화해서 다음 인덱스부터 비교 if(arr[i] > maxValue){ maxValue = arr[i]; maxIdx = i; } } return new int[]{maxValue, maxIdx}; } public static void main(String[] args) { // arr 선언 int[] arr = new int[]{-3, -29, -38, -12, -57, -74, -40, -85, -61}; Max02 max02 = new Max02(); int[] result = max02.getMax(arr); // 테스트 코드 if(result[0] == -3 && result[1] == 0){ System.out.println("테스트 통과"); }else{ System.out.println("테스트 실패 result: " + result); } } }
Java
복사

문제 2) codeup 4596 : 최대값 2

문제 설명 <그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수가 주어질 때, 이들 중 최대값을 찾고 그 최대값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.
Plain Text
복사
public class MaxInMatrix { public static void main(String[] args) { int[][] arr = new int[][]{ {3, 23, 85, 34, 17, 74, 25, 52, 65}, {10, 7, 39, 42, 88, 52, 14, 72, 63}, {87, 42, 18, 78, 53, 45, 18, 84, 53}, {34, 28, 64, 85, 12, 16, 75, 36, 55}, {21, 77, 45, 35, 28, 75, 90, 76, 1}, {25, 87, 65, 15, 28, 11, 37, 28, 74}, {65, 27, 75, 41, 7, 89, 78, 64, 39}, {47, 47, 70, 45, 23, 65, 3, 41, 44}, {87, 13, 82, 38, 31, 12, 29, 29, 80}, }; // loop를 돌아야 합니다 9 * 9 int maxValue = arr[0][0]; int[] maxIdx = {0, 0}; // i, j 최대값의 위치 for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (arr[i][j] > maxValue) { maxValue = arr[i][j]; maxIdx[0] = i; maxIdx[1] = j; } } } System.out.println("maxValue= " + maxValue); System.out.println(Arrays.toString("maxIdx= " + maxIdx)); } }
Java
복사
2차원 배열의 진행 순서 arr[i][j] = 세로 순회 arr[j][i] = 가로 순회

문제 3) 다형성을 적용해 최대값과 최소값 구하기

Template Callback 사용
Template Mathod(private) 클래스 안에서만 호출되는 Template 생성
public으로 max(), min() 메소드에서 Template 메소드를 호출
바뀐 부분만 내부 클래스로 구현해서 parameter로 넘김
interface 선언
interface Compare { boolean doSomething(int valueA, int valueB); } public class MaxAndMin { private int getMaxOrMin(int[] arr, Compare compare) { // 인터페이스 자체를 넘기는 callback int targetValue = arr[0]; // arr[0]과 arr[1]부터 비교할 수 있도록 i = 1; 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= " + maxResult); System.out.println("minResult=" + minResult); } }
Java
복사
실행 순서
인텔리제이 단축키

데이터 모델링

데이터 모델링이란? 정보시스템 구축의 대상이 되는 업무 내용을 분석하여 이해하고 약속된 표기법에 의해 표현하는걸 의미한다

데이터 모델링 절차

요구사항 분석
어떠한 업무를 시작하기 전에 해당하는 업무에 대해서 파악하는 단계
개념적 설계
내가 하고자 하는 일의 데이터 간의 관계를 구상하는 단계
논리적 설계
구체화된 업무중심의 데이터 모델을 만들어 내는 단계
물리적 설계
최종적으로 데이터를 관리할 데이터 베이스를 선택하고, 선택한 데이터 베이스에 실제 테이블을 만드는 작업을 하는 단계

서울시 병의원 데이터 모델링

요구사항 분석

1.
병원 분류명이 총 몇가지인지
2.
병원분류별로 몇개씩 있는지
ex) 의원 x개 치과병원 y개 한방병원 z개
3.
병원 분류가 몇가지인지
4.
서울의 구별로 각 병원이 몇개인지
ex) 서울시 금천구 의원, 한방병원, 치과병원, …
5.
구별로 병원이 가장 많은 구는?
6.
이비인후과, 외과, 내과, 소아과, 피부과, 성형외과는 각 몇개인지

개념적 설계

논리적 설계

컬럼명
설명
Type
ex
id(Pk)
VARCHAR(8)
A1120837
address
전체 주소
VARCHAR(90)
district
서울특별시 00구
VARCHAR(15)
서울특별시 강남구
category
...나중에 추가 작성병원분류 c
VARCHAR(1)
A: 종합병원 B: 병원 C: 의원 D: 요양병원 E: 한방병원 G: 한의원 I: 기타 M: 치과병원 N: 치과의원 R: 보건소
emergency_room
응급실운영여부 1 운영 2 운영안함
INT
1 또는 2
name
해당 병원의 이름
VARCHAR(40)
가로수치과의원
subdivision
세부 분과 피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과, 등
VARCHAR(10)
피부과 흉부외과 영상의학과

물리적 설계

1.
테이블 생성
CREATE TABLE `likelion-db`.`seoul_hospital` ( `id` VARCHAR(8) NOT NULL, `address` VARCHAR(90) NOT NULL COMMENT '전체 주소', `district` VARCHAR(15) NOT NULL COMMENT '서울시 00구', `category` VARCHAR(1) NOT NULL COMMENT '병원분류\nC의원\nE한방병원\nN치과의원\n\n', `emergency_room` INT NOT NULL COMMENT '응급실 운영여부\n운영 1\n안함 2\n', `name` VARCHAR(40) NOT NULL COMMENT '해당 병원명', `subdivision` VARCHAR(10) NULL COMMENT '세부 분과\n피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과 등\n', PRIMARY KEY (`id`));
SQL
복사
2.
데이터 insert

sql문으로 insert

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

파일로 db에 insert

1.
파일에 sql문 작성 후 저장
2.
workbench에서 .sql 스크립트 불러오기
3.
불러온 .sql 스크립트 실행
Insert Into 작성 팁

Java로 .sql파일 만들기

파일 만들기
.csv에서 line별로 읽어오기
JavaObject Hospital()
id(Pk)
address
district
category
emergency_room
name
subdivision
line별로 읽어와서 필요한 정보만 뽑아서 Object에 담기
setSubdivision()
생성자에서 setDistrict() 추가 생성해서 호출
address.split(””) —> [0]+ “” + [1] —> 서울특별시 금천구 형태로 만들수 있음
subdivision은 병원이름(name)을 기준
피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과 등의 단어가 포함 되어 있으면
ex) 피부과가 포함 되어 있으면 피부과

- 실습

파일 읽어와서 List<String>으로 만들기
public class LineReader { // 파일 읽어와서 List<String>으로 만들기 List<String> readLines(String filename) throws IOException { List<String> result = new ArrayList<>(); // List형태로 return할 수 있드록 BufferedReader br = new BufferedReader(new FileReader(filename)); String str; // null이 될때까지 한줄씩 읽어옴 while ((str = br.readLine()) != null){ result.add(str); } return result; } // readLines 이용해서 입력받은 것을 String으로 리턴 public static void main(String[] args) throws IOException { String filename = "C:\\Users\\ocean\\Downloads\\서울시 병의원 위치 정보.csv"; LineReader lr = new LineReader(); List<String> lines = lr.readLines(filename); System.out.println(lines.size()); } }
Java
복사
위의 LineReader를 재사용할 수 있도록 리팩토링
public interface Parser<T> { T parse(String str); // 읽어올 파일에 따라서 타입이 변하기 때문에 T를 적어줌 }
Java
복사
import com.line.domain.Hospital; public class HospitalParser implements Parser<Hospital>{ @Override public Hospital parse(String str) { String[] splitted = str.split(","); // csv는 쉼표로 구분되어 있는 데이터이기 때문에 쉼표를 기준으로 데이터 자르기 return new Hospital(splitted[0]); // 병원 id 넘김 } }
Java
복사
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
복사
public class Hospital { private String id; // id를 받아줄 constructor 생성 public Hospital(String id) { this.id = id; } public String getId() { return id; } }
Java
복사
public class Main { public static void main(String[] args) throws IOException { LineReader<Hospital> hospitalLineReader = new LineReader<>(new HospitalParser()); String filename = "C:\\Users\\ocean\\Downloads\\서울시 병의원 위치 정보.csv"; List<Hospital> hospitals = hospitalLineReader.readLines(filename); System.out.println(hospitals.size()); for (Hospital hospital : hospitals) { System.out.println(hospital.getId()); } } }
Java
복사

알고리즘

문제 1) codeup 2081 : 최대값 I

문제 설명 9개의 서로 다른 자연수가 주어질 때, 이들 중 최대값을 찾고 그 최대값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
Plain Text
복사
public class Max01 { public static void main(String[] args) { // 주어진 배열 안에서 최대값 구하기 // 배열 선언 int[] arr = new int[]{3, 29, 38, 12, 57, 74, 40, 85, 61}; // loop 구성 (전체 순회) _ 이런 문제들은 한번 싹 출력해보는게 좋음 // 비교할 변수 선언 int maxValue = 0; for(int i = 0; i < arr.length; i++){ if(arr[i] > maxValue){ maxValue = arr[i]; } } } }
Java
복사
문제점: maxValue를 0으로 초기화했을 때, 배열의 값이 모두 음수인 경우 0이 max가 된다
// 수정 코드 public class Max02 { public int[] getMax(int[] arr){ // loop 구성 int maxIdx = 0; int maxValue = arr[0]; for(int i = 1; i < arr.length; i++){ // i를 1로 초기화해서 다음 인덱스부터 비교 if(arr[i] > maxValue){ maxValue = arr[i]; maxIdx = i; } } return new int[]{maxValue, maxIdx}; } public static void main(String[] args) { // arr 선언 int[] arr = new int[]{-3, -29, -38, -12, -57, -74, -40, -85, -61}; Max02 max02 = new Max02(); int[] result = max02.getMax(arr); // 테스트 코드 if(result[0] == -3 && result[1] == 0){ System.out.println("테스트 통과"); }else{ System.out.println("테스트 실패 result: " + result); } } }
Java
복사

문제 2) codeup 4596 : 최대값 2

문제 설명 <그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수가 주어질 때, 이들 중 최대값을 찾고 그 최대값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.
Plain Text
복사
public class MaxInMatrix { public static void main(String[] args) { int[][] arr = new int[][]{ {3, 23, 85, 34, 17, 74, 25, 52, 65}, {10, 7, 39, 42, 88, 52, 14, 72, 63}, {87, 42, 18, 78, 53, 45, 18, 84, 53}, {34, 28, 64, 85, 12, 16, 75, 36, 55}, {21, 77, 45, 35, 28, 75, 90, 76, 1}, {25, 87, 65, 15, 28, 11, 37, 28, 74}, {65, 27, 75, 41, 7, 89, 78, 64, 39}, {47, 47, 70, 45, 23, 65, 3, 41, 44}, {87, 13, 82, 38, 31, 12, 29, 29, 80}, }; // loop를 돌아야 합니다 9 * 9 int maxValue = arr[0][0]; int[] maxIdx = {0, 0}; // i, j 최대값의 위치 for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (arr[i][j] > maxValue) { maxValue = arr[i][j]; maxIdx[0] = i; maxIdx[1] = j; } } } System.out.println("maxValue= " + maxValue); System.out.println(Arrays.toString("maxIdx= " + maxIdx)); } }
Java
복사
2차원 배열의 진행 순서 arr[i][j] = 세로 순회 arr[j][i] = 가로 순회

문제 3) 다형성을 적용해 최대값과 최소값 구하기

Template Callback 사용
Template Mathod(private) 클래스 안에서만 호출되는 Template 생성
public으로 max(), min() 메소드에서 Template 메소드를 호출
바뀐 부분만 내부 클래스로 구현해서 parameter로 넘김
interface 선언
interface Compare { boolean doSomething(int valueA, int valueB); } public class MaxAndMin { private int getMaxOrMin(int[] arr, Compare compare) { // 인터페이스 자체를 넘기는 callback int targetValue = arr[0]; // arr[0]과 arr[1]부터 비교할 수 있도록 i = 1; 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= " + maxResult); System.out.println("minResult=" + minResult); } }
Java
복사
실행 순서
인텔리제이 단축키

데이터 모델링

데이터 모델링이란? 정보시스템 구축의 대상이 되는 업무 내용을 분석하여 이해하고 약속된 표기법에 의해 표현하는걸 의미한다

데이터 모델링 절차

요구사항 분석
어떠한 업무를 시작하기 전에 해당하는 업무에 대해서 파악하는 단계
개념적 설계
내가 하고자 하는 일의 데이터 간의 관계를 구상하는 단계
논리적 설계
구체화된 업무중심의 데이터 모델을 만들어 내는 단계
물리적 설계
최종적으로 데이터를 관리할 데이터 베이스를 선택하고, 선택한 데이터 베이스에 실제 테이블을 만드는 작업을 하는 단계

서울시 병의원 데이터 모델링

요구사항 분석

1.
병원 분류명이 총 몇가지인지
2.
병원분류별로 몇개씩 있는지
ex) 의원 x개 치과병원 y개 한방병원 z개
3.
병원 분류가 몇가지인지
4.
서울의 구별로 각 병원이 몇개인지
ex) 서울시 금천구 의원, 한방병원, 치과병원, …
5.
구별로 병원이 가장 많은 구는?
6.
이비인후과, 외과, 내과, 소아과, 피부과, 성형외과는 각 몇개인지

개념적 설계

논리적 설계

컬럼명
설명
Type
ex
id(Pk)
VARCHAR(8)
A1120837
address
전체 주소
VARCHAR(90)
district
서울특별시 00구
VARCHAR(15)
서울특별시 강남구
category
...나중에 추가 작성병원분류 c
VARCHAR(1)
A: 종합병원 B: 병원 C: 의원 D: 요양병원 E: 한방병원 G: 한의원 I: 기타 M: 치과병원 N: 치과의원 R: 보건소
emergency_room
응급실운영여부 1 운영 2 운영안함
INT
1 또는 2
name
해당 병원의 이름
VARCHAR(40)
가로수치과의원
subdivision
세부 분과 피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과, 등
VARCHAR(10)
피부과 흉부외과 영상의학과

물리적 설계

1.
테이블 생성
CREATE TABLE `likelion-db`.`seoul_hospital` ( `id` VARCHAR(8) NOT NULL, `address` VARCHAR(90) NOT NULL COMMENT '전체 주소', `district` VARCHAR(15) NOT NULL COMMENT '서울시 00구', `category` VARCHAR(1) NOT NULL COMMENT '병원분류\nC의원\nE한방병원\nN치과의원\n\n', `emergency_room` INT NOT NULL COMMENT '응급실 운영여부\n운영 1\n안함 2\n', `name` VARCHAR(40) NOT NULL COMMENT '해당 병원명', `subdivision` VARCHAR(10) NULL COMMENT '세부 분과\n피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과 등\n', PRIMARY KEY (`id`));
SQL
복사
2.
데이터 insert

sql문으로 insert

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

파일로 db에 insert

1.
파일에 sql문 작성 후 저장
2.
workbench에서 .sql 스크립트 불러오기
3.
불러온 .sql 스크립트 실행
Insert Into 작성 팁

Java로 .sql파일 만들기

파일 만들기
.csv에서 line별로 읽어오기
JavaObject Hospital()
id(Pk)
address
district
category
emergency_room
name
subdivision
line별로 읽어와서 필요한 정보만 뽑아서 Object에 담기
setSubdivision()
생성자에서 setDistrict() 추가 생성해서 호출
address.split(””) —> [0]+ “” + [1] —> 서울특별시 금천구 형태로 만들수 있음
subdivision은 병원이름(name)을 기준
피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과 등의 단어가 포함 되어 있으면
ex) 피부과가 포함 되어 있으면 피부과

- 실습

파일 읽어와서 List<String>으로 만들기
public class LineReader { // 파일 읽어와서 List<String>으로 만들기 List<String> readLines(String filename) throws IOException { List<String> result = new ArrayList<>(); // List형태로 return할 수 있드록 BufferedReader br = new BufferedReader(new FileReader(filename)); String str; // null이 될때까지 한줄씩 읽어옴 while ((str = br.readLine()) != null){ result.add(str); } return result; } // readLines 이용해서 입력받은 것을 String으로 리턴 public static void main(String[] args) throws IOException { String filename = "C:\\Users\\ocean\\Downloads\\서울시 병의원 위치 정보.csv"; LineReader lr = new LineReader(); List<String> lines = lr.readLines(filename); System.out.println(lines.size()); } }
Java
복사
위의 LineReader를 재사용할 수 있도록 리팩토링
public interface Parser<T> { T parse(String str); // 읽어올 파일에 따라서 타입이 변하기 때문에 T를 적어줌 }
Java
복사
import com.line.domain.Hospital; public class HospitalParser implements Parser<Hospital>{ @Override public Hospital parse(String str) { String[] splitted = str.split(","); // csv는 쉼표로 구분되어 있는 데이터이기 때문에 쉼표를 기준으로 데이터 자르기 return new Hospital(splitted[0]); // 병원 id 넘김 } }
Java
복사
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
복사
public class Hospital { private String id; // id를 받아줄 constructor 생성 public Hospital(String id) { this.id = id; } public String getId() { return id; } }
Java
복사
public class Main { public static void main(String[] args) throws IOException { LineReader<Hospital> hospitalLineReader = new LineReader<>(new HospitalParser()); String filename = "C:\\Users\\ocean\\Downloads\\서울시 병의원 위치 정보.csv"; List<Hospital> hospitals = hospitalLineReader.readLines(filename); System.out.println(hospitals.size()); for (Hospital hospital : hospitals) { System.out.println(hospital.getId()); } } }
Java
복사