자료구조와 알고리즘/문제풀이

[코테에 많이 활용되는 기법] - 메서드 etc.

jenlve 2024. 1. 15. 23:52

1. 아무리 봐도 로직은 맞는데 시간초과가 날 경우 생각해볼 방안

1-1. 출력 형식을 System.out.println이 아  String Builder로 가져가자. 

1-2. 입력 형태를 Scanner가 아닌 BufferedReader로 가져가자. 

* StringBuilder에 모든 내용을 한꺼번에 넣어서 append하는 것보다 하나씩 분리해서 append를 이어붙이는 식으로 해야 속도가 더 빠르다. 

 

2. HashSet에 add 메서드 사용 시 배열을 넣을 경우, 해당 배열의 참조변수가 들어가기 때문에 배열 간의 중복검사는 set으로 할 수 없다.  

🏷️ Integer ArrayList를 int 배열로 바꾸고자 할 때

import java.util.*;

public static void main(String args[]) {

    List<Integer> list = new ArrayList<>(); // 인 상황에서

    int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
}

 

🏷️ int[]에서 최소/최대값을 구할려고 할 때

int[] list = new int[]{2, 67, 34, 8};

int min = Arrays.stream(list).min().getAsInt();
int max = Arrays.stream(list).max().getAsInt();

 

🏷️ 특정 인덱스 범위에 해당하는 배열을 복사할 때

Arrays.copyOfRange(원본 배열, 시작 인덱스, 끝 인덱스(포함X));

 

🏷️ 객체 간 속성 값 비교 : Comparable 인터페이스의 compareTo 메서드

class Student implements Comparable<Student> {
 
	int age;			// 나이
	
	Student(int age) {
		this.age = age;
	}
	
	@Override
	public int compareTo(Student o) {
    
		// 자기자신의 age가 입력으로 들어온 o의 age보다 크다면 양수
		if(this.age > o.age) {
			return 1;
		}
		// 자기 자신의 age와 o의 age가 같다면 0
		else if(this.age == o.age) {
			return 0;
		}
		// 자기 자신의 age가 o의 age보다 작다면 음수
		else {
			return -1;
		}
	}
}

 

(비교 대상이 되는 원래 객체).compareTo(새로 들어온 객체);

 

compareTo 메서드 : 음수, 0, 양수의 값을 반환해준다.

입력으로 들어온 객체의 속성 값과 비교 대상이 되는 객체의 속성 값을 비교하는데, 주체는 비교 대상 객체이다.

즉, 입력값에 비해, 비교 대상이 더 크면 양수를, 같으면 0을, 작으면 음수를 내보내게 된다. 

 

compareTo를 오버라이딩해서 내림차순 등을 구현할 수 있다. 


동작 원리는 음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경된다.

 

예를들어 { 2, 1, 3 } 이라는 배열이 있고, Arrays.sort(array, (a, b) -> b.compareTo(a)); 을 실행한다면, 

Arrays.sort로 우선 오름차순 정렬이 되고, (1,2,3} 에서 1 , 2가 들어오면 a = 1, b = 2로  compareTo는 양수를 출력하게 되고 두 숫자는 자리를 바꾸게 된다.