1. 알고리즘
•
입력은 2차원 배열
•
2차원 배열은 요소는 1행 1열부터 시작
•
입력되는 값은 모두 자연수
i) Max 알고리즘
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 0: value, 1: row, 2: column
int[] maxArray = new int[3];
for(int i=0 ; i<9 ; i++){
int[] row = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
for(int j=0; j<row.length ; j++) {
if(row[j] > maxArray[0]){
maxArray[0] = row[j];
maxArray[1] = i + 1;
maxArray[2] = j + 1;
}
}
}
System.out.println(maxArray[0]);
System.out.println(maxArray[1] + " " + maxArray[2]);
}
}
Java
복사
public class 최대값구하기2 { |
ii) Min 알고리즘
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 0: value, 1: row, 2: column
int[] minArray = new int[3];
for(int i=0 ; i<9 ; i++){
int[] row = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
for(int j=0; j<row.length ; j++) {
if(row[j] < maxArray[0]){
minArray[0] = row[j];
minArray[1] = i + 1;
minArray[2] = j + 1;
}
}
}
System.out.println(minArray[0]);
System.out.println(minArray[1] + " " + minArray[2]);
}
}
Java
복사
알고리즘 문제 2
최대값 알고리즘
•
모든 행과 열을 탐색하기 위해 이중 반복문을 활용할 수 있다.
•
행을 BufferedReader readLine() 메소드로 입력받으면 각 숫자를 max와 비교하며 max 값을 찾는다. 그때 i와 j를 행과 열로 저장한다.
•
행과 열 모두 1부터 시작하기에 0부터 인덱스와 차이가 있다. 따라서 마지막에 1을 더해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class No4596Max {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int max = 0;
int row = 0;
int column = 0;
for (int i = 0; i < 9; i++) {
int[] rowInt = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
for (int j = 0; j < rowInt.length; j++) {
if (max < rowInt[j]) {
max = rowInt[j];
row = i;
column = j;
}
}
}
System.out.println(max);
System.out.printf("%d %d", row + 1, column + 1);
}
}
Java
복사
LineReader.java 파일 다형성으로 구현하기
정상희
•
다형성 적용 이전, 읽어온 string을 그대로 저장한 LineReader
// 첫번째 filereader : 파일 내용을 string으로 한 줄씩 읽어옴
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class LineReader {
List<String> readLine(String filename) throws IOException {
List<String> result = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader(filename));
String str;
while((str= br.readLine())!= null){ // filename을 한 줄씩 읽어옵니다
result.add(str);
}
return result;
}
public static void main(String[] args) throws IOException {
LineReader lr = new LineReader();
String targetFile = "C:\\Users\\wjdtk\\Downloads\\서울시 병의원 위치 정보.csv";
List<String> line = lr.readLine(targetFile); //한 줄씩 읽어서 line에 저장
System.out.println(line.size());
}
}
Java
복사
•
설계도
file 위치
OPP 구현 순서
다형성의 이해
i) Parser 인터페이스
public interface Parser<T> {
// parsing할 파일의 자료형에 따라 Object를 다양하게 받기 위해 제네릭 <T>
T parse(String str);
}
Java
복사
ii) interface 구현체 HospitalParser 생성
import Parser.Parser;
import domain.Hospital;
public class HospitalParser implements Parser<Hospital> { // Interface Parser의 구현체
private String getSubdivision(String name) {
String[] subDibisions = {"소아과", "피부과", "성형외과", "정형외과", "산부인과", "관절", "안과", "가정의학과", "비뇨기과", "치과", "내과", "외과", "한의원"};
for(String subDivision : subDibisions){
if(name.contains(subDivision)) {
return subDivision;
}
}
return "";
}
public Hospital parse(String str) {
str= str.replaceAll("\"", "");
String[] splitted = str.split(",");
String name = splitted[10];
String subDivision = getSubdivision(name);
return new Hospital(splitted[0],splitted[1],splitted[2],splitted[6],name, subDivision);
}
}
Java
복사
iii) Hospital 클래스
package domain;
public class Hospital {
private String id;
private String address;
private String category;
private String district;
private String name;
private Integer emergency_room; // emergencyroom은 숫자라서 Integer입니다
private String subDivision;
public Hospital(String id, String address, String category, String emergency_room,
String name, String subDivision) {
this.id = id;
this.address = address;
this.name = name;
this.emergency_room = Integer.parseInt(emergency_room);
this.subDivision = subDivision;
setDistrict(address);
}
public void setDistrict(String str) {
String[] splitted = str.split(" ");
this.district = splitted[0]+" "+splitted[1]; // 서울시 어쩌구~어쩌구 ~ -> "서울시 00구"로 파싱
}
public String getId() {
return id;
}
public String getAddress() {
return address;
}
public String getCategory() {
return category;
}
public String getDistrict() {
return district;
}
public String getName() {
return name;
}
public Integer getEmergency_room() {
return emergency_room;
}
public String getSubDivision() {
return subDivision;
}
}
Java
복사
iv) LineReader 클래스 수정
•
parser을 LineReader생성자에서 초기화
import Parser.Parser; // import Parser
import domain.Hospital;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class LineReader<T> {
Parser<T> parser;
private boolean isRemoveColumName = true;
public LineReader(Parser<T> parser, boolean isRemoveColumName) {
this.parser = parser;
this.isRemoveColumName = isRemoveColumName;
}
List<T> readLine(String filename) throws IOException {
List<T> result = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader(filename));
String str;
if(isRemoveColumName){
br.readLine();
}
while((str= br.readLine())!= null){
// parse()가 호출되어 실행되면, return할 때 hospital 객체를 생성하고 종료합니다.
// 19xxxx 개의 hospital을 저장하기 위해 main에서 List를 작성할 것이다.
result.add(parser.parse(str));
}
return result;
}
}
Java
복사
v) Main 클래스
import domain.Hospital;
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
String targetFile = "C:\\Users\\wjdtk\\Downloads\\서울시 병의원 위치 정보.csv";
LineReader<Hospital> hospitalLineReader = new LineReader<Hospital>(new HospitalParser(), true);
List<Hospital> hospitals = hospitalLineReader.readLine(targetFile);
for(Hospital hospital : hospitals){
System.out.printf("%s,%s,%s,%s,%d,%s,%s\n", hospital.getId(),hospital.getAddress(),hospital.getDistrict(),hospital.getCategory(),
hospital.getEmergency_room(),hospital.getName(), hospital.getSubDivision());
}
}
}
Java
복사