자바로 코테 언어를 바꾸기로 결심했습니다... (C++ -> 파이썬 찍먹 -> 자바...)
이번에는 꼭 정착할 수 있기를 바랍니다. 아니 정착할 것입니다.
자바로 코테 준비를 시작하며 다른 분들의 코드를 보고 모은 정보를 기록해보겠습니다.
이 글은 코테를 준비하며 계속 업데이트 할 예정입니다.
java.io 패키지와 java.util 패키지에서 사용하는 클래스가 많은 모양이다. 이 둘은 그냥 시작과 동시에 import 해주자.
import java.util.*;
import java.io.*;
입출력은 BufferedReader, BufferedWriter를 쓰는 것이 빠르다. 다음과 같이 선언해준다. 아래 코드에서 쓰인 클래스들은 모두 java.io에 선언되어 있다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input = br.readLine();
StringTokenizer는 문자열을 구분자를 이용하여 분리할 때 사용한다. StringTokenizer는 java.util 패키지에 정의되어 있다.
BufferedReader 클래스의 메소드로 문자열을 읽어온다면 라인 단위로 읽어오게 될 것이다. 그때 구분자를 통해서 문자열을 분리할 때 사용하자.
StringTokenizer의 생성자는 3가지이다.
StringTokenizer st1 = new StringTokenizer(문자열); // 1. 공백을 기준으로 구분
StringTokenizer st2 = new StringTokenizer(문자열, 구분자); // 2. 구분자를 기준으로 구분. 구분자의 타입은 String
StringTokenizer st3 = new StringTokenizer(문자열, 구분자, true/false);
아마 주로 1 아님 2를 쓰게될 듯 싶다.
출처: https://dev-coco.tistory.com/94
int W = Integer.parseInt(str.nextToken());
int로 받으면서 Integer.parseInt(str.nextToken()) 이렇게 써주면 된다.
parseInt는 Integer 클래스에 선언되어 있는 스태틱 메소드이다.
그리고 저기서 str은 StringTokenizer이고 nextToken() 메소드를 통해서 토큰에 하나하나 접근할 수 있다.
배열, Collection을 정렬하는 방법을 알아보자.
배열은 Arrays.sort()
메소드를 통해서 정렬 가능하다. Arrays.sort()는 배열의 타입에 상관없이 Comparable 인터페이스가 구현되어 있다면 모두 사용 가능하다.
int와 같은 primitive type 배열의 오름차순 정렬은 그냥 이렇게 하면 된다. long 타입도 마찬가지이다.
int[] arr = {5, 6, 2, 4, 2};
Arrays.sort(arr); // 그냥 이렇게 하면 됨
하지만 내림차순 정렬을 해야할 때에는 좀 달라진다. 내림차순 정렬을 할 땐, Arrays.sort()의 두번째 인자로 Collections.reverseOrder()라는 메소드를 함께 전달해야하는데, 이것을 쓰려면 Comparable을 구현한 클래스여야하기 때문이다. 따라서 Integer와 같은 래퍼 클래스 타입으로 배열을 선언해주면 된다. Integer, String과 같은 클래스들은 Comparable 인터페이스를 구현하고 있다.
Integer[] arr = {5, 6, 2, 4, 2}; // int[]로 선언하면 컴파일에러!
Arrays.sort(arr, Collections.reverseOrder()); // 6 5 4 2 2로 정렬된다.
위에서 언급했다 싶이, reference type은 Comparable 인터페이스를 구현해야하므로 compareTo() 메소드를 구현해야한다.
예를 들어 다음과 같은 Student 클래스가 있다고 하자.
class Student {
int id;
String name;
}
이 Student 객체들이 들어있는 배열을 id를 기준으로 정렬하고 싶을 수 있다. 그렇다면 아래처럼 해주면 된다.
class Student implements Comparable<Student>{
int id;
String name;
@Override
public int compareTo(Student o) {
return this.id - o.id;
}
}
compareTo() 메소드를
1. this의 id가 o의 id보다 작을 경우, 음수 리턴
2. this의 id와 o의 id가 같을 경우, 0을 리턴
3. this의 id가 o의 id보다 클 경우, 양수 리턴
이렇게 구현해주고
Arrays.sort(students); // students는 Student 객체가 담긴 배열을 의미합니다.
이렇게 정렬해주면 id를 기준으로 오름차순으로 정렬이 된다. (this의 값에서 o의 값을 빼준 값을 리턴하도록 구현하면 오름차순으로 정렬된다고 기억하기)
마찬가지로 내림차순으로 정렬하고 싶다면 아래와 같이 해주면 된다.
Arrays.sort(students, Collections.reverseOrder());
출처: https://codechacha.com/ko/java-sorting-array/
ArrayList와 같은 리스트형 컬렉션을 정렬하려면 어떻게 해야하는지 알아보자.
<>안 타입 지정자에는 primitive type이 올 수 없다. 즉, 아래 코드에서 윗줄은 컴파일 에러를 발생시키고 아래와 같이 reference type으로 선언해줄 수 있다.
List<int> list = new ArrayList<>(); // 컴파일 에러
List<Integer> list2 = new ArrayList<>(); // 이렇게 선언해야함
형식을 지정하지 않고 List를 선언하고 1, 2 같은 수를 넣어도 Integer로 저장될 것이다. 왜냐하면 ArrayList는 내부적으로 요소를 저장하는 배열의 타입을 Object[]로 쓰고 있기 때문이다. 따라서 ArrayList 같은 Collection에 int 같은 primitive 타입이 들어갈 일은 없으므로 바로 reference type에서 어떻게 정렬할 수 있는지 설명해보려한다.
Collections.sort() 메소드를 통해 Collection을 정렬할 수 있다. 이 또한 배열의 객체가 Comparable을 구현하고 있어야하며 Arrays.sort()와 사용방법이 유사하다.
Collections.sort(list); // 오름차순 정렬
Collections.sort(list, Collections.reverseOrder()); // 내림차순 정렬
ArrayList 자체의 sort 메소드를 통해서도 정렬이 가능하다.
ArrayList<Integer> arr = new ArrayList<>(Arrays.asList(5,3,1,4,2));
arr.sort(Comparator.naturalOrder()); // 오름차순 정렬
arr.sort(Comparator.reverseOrder()); // 내림차순 정렬
ArrayList의 sort() 메소드를 쓸 때는, Comparator의 메소드를 매개변수로 함께 넘겨주어야한다.
Comparator를 새롭게 만들어서 compare 메소드를 오버라이드하여 원하는 기준으로 정렬도 가능하다.
arr.sort(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a - b;
}
});