목차
알고리즘
최대값 최소값
코드
최대값 구하기
public class MaxNum {
int getMax(int[] arr) {
int maxNum = arr[0]; // 배열의 첫 번째 값으로 초기화함.
for (int i = 1; i < arr.length; i++) { // 이미 첫 번째 값으로 초기화했기때문에 1번 인덱스부터 시작.
if (maxNum < arr[i]) { // 저장한 maxNum보다 큰 값이 있으면
maxNum = arr[i]; // 그 값을 maxNum에 덮어씌움.
}
}
return maxNum;
}
public static void main(String[] args) {
int[] arr = {-3, -29, -38, -12, -57, -74, -40, -85, -61};
MaxNum m = new MaxNum();
System.out.println(m.getMax(arr) == -3);
}
}
Java
복사
최대값 구하기
public class MinNum {
int getMin(int[] arr) {
int minNum = arr[0];
for (int i = 1; i < arr.length; i++) {
if (minNum > arr[i]) { // 비교 조건만 바꿔주면 된다.
minNum = arr[i];
}
}
return minNum;
}
public static void main(String[] args) {
int[] arr = {-3, -29, -38, -12, -57, -74, -40, -85, -61};
MinNum m = new MinNum();
System.out.println(m.getMin(arr) == -85);
}
}
Java
복사
리팩토링
최대값을 구하는 로직과 최소값을 구하는 로직 사이의 차이는 비교 조건 차이뿐이다.
두 정수 비교를 추상화하여 구현해보자.
IsCompare
public interface IsCompare {
boolean isCompare(int a, int b);
}
Java
복사
MaxCompare
public class MaxCompare implements IsCompare{
@Override
public boolean isCompare(int a, int b) {
return a < b;
}
}
Java
복사
MinCompare
public class MinCompare implements IsCompare{
@Override
public boolean isCompare(int a, int b) {
return a > b;
}
}
Java
복사
MaxMinContext
public class MaxMinContext {
private int getNum(int[] arr, IsCompare isCompare) {
int num = arr[0];
for (int i = 1; i < arr.length; i++) {
if (isCompare.isCompare(num, arr[i])) {
num = arr[i];
}
}
return num;
}
public int getMax(int[] arr) {
return getNum(arr, new MaxCompare());
}
public int getMin(int[] arr) {
return getNum(arr, new MinCompare());
}
}
Java
복사
Main
public class Main {
public static void main(String[] args) {
int[] arr = {-3, -29, -38, -12, -57, -74, -40, -85, -61};
MaxMinContext context = new MaxMinContext();
int maxNum = context.getMax(arr);
int minNum = context.getMin(arr);
System.out.println(maxNum);
System.out.println(minNum);
}
}
Java
복사
2차 배열 최대값
코드업 4596번 문제
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int maxNum = -1;
int row = -1;
int col = -1;
for (int i = 0; i < 9; i++) {
String strNum[] = sc.nextLine().split(" ");
for (int j = 0; j < 9; j++) {
int inputNum = Integer.parseInt(strNum[j]);
if (maxNum < inputNum) {
maxNum = inputNum;
row = i;
col = j;
}
}
}
System.out.println(maxNum);
System.out.printf("%d %d\n", ++row, ++col);
}
}
Java
복사
시간복잡도
•
O(N)
•
O(1)
•
O(logN)
•
O(N^2)
DB
데이터 분석
요구사항 분석
1.
병원분류명이 총 몇가지 인지?
2.
병원분류별로 몇개씩 있는지? ex) 의원:x개 치과병원:y개 한방병원:z개 …
3.
병원 분류가 몇가지 인지?
4.
서울의 구별로 각 병원이 몇개 있는지 ex) 서울시 금천구 의원, 한방병원, 치과병원, .. 이 각 몇개인지?
5.
구별로 병원이 가장 많은 구는?
6.
이비인후과(0), 외과(1), 내과(2), 소아과(3), 피부과, 성형외과 는 각 몇개인지(category)
개념적 설계
논리적 설계
컬럼명 | 설명 | Type | ex |
id(PK) | VARCHAR(8) | A1120837 | |
address | 전체 주소 | VARCHAR(90) | ~~ |
district | 서울특별시 xx구 | VARCHAR(15) | 서울특별시 강남구 |
category | 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) | 피부과
성형외과 |
물리적 설계
CREATE TABLE `hospital`.`seoul` (
`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 '응급실운영여부\n1 운영\n2 운영안함\n',
`name` VARCHAR(40) NOT NULL COMMENT '해당 병원의 이름',
`subdivision` VARCHAR(10) NULL COMMENT '세부 분과\n피부과, 성형외과, 외과, 내과, 소아과, 가정의학과, 치과, 등\n',
PRIMARY KEY (`id`));
SQL
복사