알고리즘 문제 풀이
1.
배열의 최대값 구하기.
•
주어진 배열
int[] arr = {3, 29, 38, 12, 57, 74, 40, 85, 61};
•
풀이
public class Max {
// 최대값 구하는 메소드 작성
public int getMax(int[] arr) {
// 초기값을 0으로 두고,
int max = 0;
// 배열값과 하나씩 비교해 보며, 배열 값이 더 클 경우 값 교체.
for (int i = 0 ; i <arr.length ; i ++) {
if(arr[i]>max) {
max = arr[i];
}
}
return max;
}
public static void main(String[] args) {
int[] arr = {3, 29, 38, 12, 57, 74, 40, 85, 61};
Max max = new Max();
int result = max.getMax(arr);
}
}
Java
복사
•
문제점
◦
배열이 0보다 작은 음수로 이루어진 경우, 무조건 0을 리턴 함.
•
코드 개선
public int getMax(int[] arr) {
// 초기값을 첫번째 배열값으로!
// 배열이 음수여도 문제 없음.
int max = arr[0];
// arr[0]이 초기화 값이니, arr[1]부터 비교하면 됨.
for (int i = 1 ; i <arr.length ; i ++) {
if(arr[i]>max) {
max = arr[i];
}
}
return max;
}
Java
복사
1-1. 배열의 최대 최소 구하기 (다형성 활용)
•
착안
: 최대, 최소를 구하는 메소드의 차이점은 단 하나 뿐.
바로 밑줄 친 부분의 부등호 방향!
for (int i = 1 ; i <arr.length ; i ++) {
if(arr[i]>targetValue) {
targetValue = arr[i];
}
}
Java
복사
→ 다형성을 활용해, 최대 최소에 따라 교체할 수 있게 만들어 보자!
•
과정
// 1. if 문 안의 부등호 비교과정을 Interface로 추상화 하자!
public int getMaxOrMin(int[] arr, Compare compare) { //callback
int targetValue = arr[0];
for (int i = 1 ; i <arr.length ; i ++) {
// Compare라는 Interface로 대체
boolean compare = compare.compare(arr[i], targetValue);
if(compare) {
targetValue = arr[i];
}
}
return targetValue;
}
Java
복사
// 2. Compare Interface 만들기
interface Compare {
// if문 안에 들어가므로 boolean을 리턴하는 메소드
// valueA 와 valueB를 비교
boolean compare(int valueA, int valueB);
}
Java
복사
// 3. Interface를 활용한 메소드 만들기
// 최대값
public int max(int[] arr) {
// getMaxOrMin 메소드를 호출하고,
// 매개변수로 배열과 인터페이스(오버라이딩)을 받음
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;
}
});
}
Java
복사
// 4. 완성
// Template
interface Compare {
boolean doSomething(int valueA, int valueB);
}
public class MaxAndMin {
// Template Method!!
private int getMaxOrMin(int[] arr, Compare compare) { //callback
int targetValue = arr[0];
for (int i = 1 ; i <arr.length ; i ++) {
boolean isSth = compare.doSomething(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 = {3, 29, 38, 12, 57, 74, 40, 85, 61};
MaxAndMin mam = new MaxAndMin();
int max = mam.max(arr);
System.out.println(max);
}
}
Java
복사
•
완성된 코드의 실행 순서. (Template CallBack 패턴)
1.
main 메소드의 int max = mam.max(arr); 실행
2.
max 메소드에서 getMaxOrMin 호출
3.
getMaxOrMin 메소드에서 사용하는 인터페이스 매개변수 Compare compare 는 max 메소드에서 오버라이딩된 상태이므로, 다시 max 로 돌아감 = CallBack
4.
max 메소드의 인터페이스 오버라이딩
new Compare() {
@Override
public boolean compare(int valueA, int valueB) {
return valueA > valueB;
}
});
Java
복사
5.
오버라이딩 된 new Compare() 를 getMaxOrMin 에서 사용.
6.
getMaxOrMin 메소드 실행
private int getMaxOrMin(int[] arr, Compare compare) { //callback
int targetValue = arr[0];
for (int i = 1 ; i <arr.length ; i ++) {
boolean compare = compare.compare(arr[i], targetValue);
if(compare) {
targetValue = arr[i];
}
}
return targetValue;
}
Java
복사
2.
2차원 배열에서 최대값 구하기.
•
풀이 방법은 1차원 배열과 같으나, 중복 for문을 사용.
public class Max2 {
public static void main(String[] args) {
int[][] arr = {
{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},
};
int max = arr[0][0];
int[] maxidx = {0,0};
// i=0인 동안 j=0~8순회 후 i=1로 감.
for (int i = 0 ; i < 9 ; i ++) {
for (int j = 0 ; j < 9 ; j ++) {
if (arr[i][j] > max) {
max = arr[i][j];
maxidx[0] = i;
maxidx[1] = j;
}
}
}
System.out.println(max);
System.out.printf("%d %d",maxidx[0]+1,maxidx[1]+1);
}
}
Java
복사
intelli J 단축키
•
Alt + 1 : 편집기 → projcet explorer 이동
•
Alt + Insert : package, class 등 새로운 파일 만들기
•
esc : projcet explorer → 편집기 이동
•
Alt + J : 같은 문자를 동시에 드래그.
◦
home : 각 드래그 행의 제일 처음으로
◦
end : 각 드래그 행의 제일 마지막으로
•
Ctrl + Alt + L : 코드 정렬
데이터 베이스에 정보 가공해서 넣기.
•
활용할 정보 : 서울시 병의원 정보
•
데이터 베이스 설계
1.
요구사항 분석 : 데이터 베이스를 통해 어떤 기능을 실현하고 싶은가
-병원분류명의 종류는?
-병원분류별로 몇 개의 병원이 있는가?
-서울의 각 구에 존재하는 병원의 수는?
-이비인후과(0), 외과(1), 내과(2), 소아과(3), 피부과, 성형외과 는 각 몇개인지(category)
2.
개념적 설계 → 무엇이 필요할 것인가
3.
논리적 설계 → 테이블 정의서 작성
서울 특별시_병의원
컬럼명 | 설명 | type | ex |
id | VARCHAR(8) | A1120837 | |
address | 전체 주소 | VARCHAR(90) | |
district | 서울시 00구 | VARCHAR(15) | 서울특별시 강남구 |
category | 병원 분류
C : 의원
E : 한방병원
N :치과의원
등.. 추후작성 | VARCHAR(1) | C
E
N |
emergency_room | 응급실운영여부
1 : 운영
2 : 운영 x | INT | 1 또는 2 |
names | 해당 병원 이름 | VARCHAR(40) | 가로수치과의원 |
subdivision | 세부분과
피부과, 성형외과
외과,내과,소아과
가정의학과,치과,등 | VARCHAR(10) | 피부과
흉부외과
영상의학과
등… |
4.
물리적 설계 → create table 하기
•
대용량 데이터를 데이터 베이스에 넣을 수 있는 형태로 가공하기.