(24.03.28) 백준 문제 풀기 + Java의 정석 학습
부모님을 도와주는 일이 있어서 아침 6시에 일어나서 오후 2시 사전캠프 시간 직전까지 밖에선 돌아다니다가 후다닥 들어왔다..
피곤했는데도 진짜 오늘 해야할 문제 풀기랑 그리고 가볍게 넘겼던 정렬에서 막히는 부분이 생겨서
정신이 바짝 들어서 학습 했다.
내일은 또 약속이 있기때문에 오전에 일찍히 Java의 정석 정렬에 관한 부분
- Collections 클래스의 정렬
- Array 클래스의 메서드
학습과 WIL 을 할 계획!
백준 문제 풀기
Brute Force 알고리즘을 좀 학습 중인데, 지금까지 나는 어떤 코드를 짰는지.. 메모리초과가 안되기 위해 + 코드를 간단하게 짜는 효율성(재귀함수의 최소화) + 클래스 사용하기 이런걸 위주로 짜느라,,
브루트 포스의 모두 다 대입하기 식의 방식이 단순한데 계속 더 꼬아서 생각하느라 뒷길로 새서 아주 코드 짜는데 시간을 다 버렸다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String n = br.readLine();
int cardNumbers = Integer.parseInt(n.split(" ")[0]);
int M = Integer.parseInt(n.split(" ")[1]);
String[] arr = br.readLine().split(" ");
int[] cards = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
cards[i] = Integer.parseInt(arr[i]);
}
ArrayList<Integer> AnswerArr = new ArrayList<>();
for (int i = 0; i < cards.length; i++) {
for (int j = i + 1; j < cards.length; j++) {
for (int k = j + 1; k < cards.length; k++) {
int sum = cards[i] + cards[j] + cards[k];
if (sum <= M) {
AnswerArr.add(sum);
} else {
AnswerArr.add(0);
}
}
}
}
Collections.sort(AnswerArr, Collections.reverseOrder());
System.out.println(AnswerArr.get(0));
br.close();
}
}
위 코드는 오늘 푼 문제 중 하나인데 그냥 짰는데도 정렬하는데만 한세월이 걸려서 왜 그런가 봤더니 정렬을 할 때,
앞서 공부를 했던 Comparator과 Comparable 인터페이스를 최대한 안쓰려고 (코드가 길어질까봐) 했지만, 결국 무식하게 다 대입하고 정렬만 하면 문제였다.
가장 큰 값을 내놔라 할 때, max메서드를 쓸 수 있는데 이게 또 Collections 메서드라 헷갈려서 한번 더 집고 넘어갈 필요가 있었고, 결국 max 를 못써서 순서를 뒤집어서 처음 값을 구하려고 했다. 심지어 그것도 Collections랑 헷갈려서 준구 난방
Collection에 대한 내용과 ArrayList에 대한 내용 특히 sort와 다른 메서드를 확인해서 학습할 필요가 있었다.
Java의 정석 학습 간단 정리
ArrayList 메서드
정렬 .sort()
(ArrayList 이름).sort()
- Array와 같이 정렬을 허용
- 일반적인 것은 오름차순 정렬이 기준
- Comparator를 사용할 경우
(ArrayList 이름).sort(Comparator C)
(ArrayList 이름).sort(new Comparator{ compare 클래스에 오버라이드 할 내용 })`
(ArrayList 이름).sort(new C{ compare 클래스에 오버라이드 할 내용 })
(ArrayList 이름).sort(new C)
- Comparator을 인자로 받는 경우 가능
- compare 메서드를 정의하기 위해서 미리 정의를 하거나 오버라이드해서 바로 sort() 괄호 안에 저의를 무조건 해야함
- 정렬을 할 어떤 규칙을 잡기 위해 compare을 정의해야할 때 사용
- 단, Comparable은 인자로 받을 수 X
- implements를 통해서 클래스에 구현하고, 오버라이드 시켜준 다음에 통째로 클래스를 sort를 해주는 방식
비도 주룩주룩 내리고 해야할 일은 쌓이고,, 해야할 공부양은 많고,, 그래도 아직 더 배우려는 게 목마르다
추가로 같은 팀원 중에 의지가 강한 분이 있는 걸 알아서 서로 응원하면서 학습하면 좋을지도!
'Today I Learned' 카테고리의 다른 글
(24.04.01) Java의 정석 학습(객체지향 프로그래밍_오버로딩, 생성자, 변수초기화, 상속, Super) (2) | 2024.04.01 |
---|---|
(24.03.29) Java의 정석 학습(Arrays 메서드) (1) | 2024.03.29 |
(24.03.27) 백준 문제 풀기 + 이전 강의들 복습 (0) | 2024.03.27 |
(24.03.26) Java의 정석 학습(지네릭스)_2 (0) | 2024.03.26 |
(24.03.25) Java의 정석 학습(지네릭스) (0) | 2024.03.25 |