알고리즘
문제 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파일 만들기
id(Pk) |
address |
district |
category |
emergency_room |
name |
subdivision |
•
setSubdivision()
•
address.split(””) —> [0]+ “” + [1] —> 서울특별시 금천구 형태로 만들수 있음
•
피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과 등의 단어가 포함 되어 있으면
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파일 만들기
id(Pk) |
address |
district |
category |
emergency_room |
name |
subdivision |
•
setSubdivision()
•
address.split(””) —> [0]+ “” + [1] —> 서울특별시 금천구 형태로 만들수 있음
•
피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과 등의 단어가 포함 되어 있으면
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
복사