//////
Search

221012

알고리즘 문제 풀이

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 comparemax 메소드에서 오버라이딩된 상태이므로, 다시 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 하기
대용량 데이터를 데이터 베이스에 넣을 수 있는 형태로 가공하기.