TIL

8/18

iksadnorth 2023. 8. 18. 23:54

👣 개요

Java로 프로그래머스 Lv.0 ~ Lv.2 수준의 알고리즘 문제를 풀이함.
Python으로 코딩 테스트를 준비했었기에 알고리즘 풀이는 익숙했으나
Java 문법에 대해 구멍이 많아 시간을 많이 소비했다.
같은 문법 실수를 범하지 않기 위해 아래에 자주 실수한 문법들을 기록하고자 한다.

 

👣 Stream 관련 주요 함수

Stream 초기화.

1. 배열 -> Stream

int[] array = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(array);

2. Collections -> Stream

List<String> stringList = Arrays.asList("apple", "banana", "orange");
Stream<String> stringStream = stringList.stream();

3. String -> Stream<Character>

String str = "Hello, World!";
IntStream stream = str.chars();
Stream<Character> characterStream = stream.mapToObj(c -> (char) c);

 

자료 가공.

.map(Function)
1대1로 각 요소를 변경

.filter(Predictor)
true를 반환하는 요소만 생존시킴.

.distinct(Comparator)
중복되는 요소 제거.

.sorted(Comparator)
내부 요소를 정렬.

 

Reduce 방법.

1. 배열 <- Stream

Stream<String> stringStream = Arrays.asList("apple", "banana", "orange").stream();
String[] stringArray = stringStream.toArray(String[]::new);

2. Collections <- Stream

Stream<String> stringStream = Arrays.asList("apple", "banana", "orange").stream();
List<String> newList = stringStream.collect(Collectors.toList());

3. String <- Stream<Character>

Stream<Character> characterStream = "Hello".chars().mapToObj(c -> (char) c);
String result = characterStream.map(Object::toString).collect(Collectors.joining());

 

👣 Comparator, Comparable 사용법

입력된 2개의 객체의 크기 비교를 위해 사용하는 클래스. 
보통 정렬 알고리즘을 이용할 때, 어떤 기준으로 객체 사이의 크기 비교를 할지 결정한다.

Comparable 인터페이스

해당 인터페이스를 구현한 객체는 별도의 로직을 동원하지 않고도 객체 자체로 크기 비교를 할 수 있다.
Comparable 인터페이스는 무조건 compareTo 메서드를 구현해야 한다.
Comparable.compareTo는 입력 파라미터가 this보다 크면 양수를, 작으면 음수를 반환해야 한다.

Comparator 인터페이스

객체에 적용해 구현하는 것이 아닌 정렬할 객체의 외부에서 정의되고 정렬 시,
해당 객체를 대입해 크기를 비교하는 인터페이스.
해당 인터페이스는 무조건 compare를 구현해야 한다. 
Comparator.compare는 2개의 파라미터가 입력되는데 앞의 것이 커야 양수고 작으면 음수를 반환해야 한다.

Comparator의 유용한 정적 메서드

Comparator.comparing(Person::getName)

특정 객체의 getter로 쉽게 작성해줌.

Comparator<Person> ageNameComparator = Comparator 
    .comparingInt(Person::getAge) 
    .thenComparing(Comparator.comparing(Person::getName));

정렬 기준을 2개 이상으로 만들어주는 메서드.
앞의 기준으로만 정렬하다가 앞의 기준조차 같으면 뒤의 기준으로 정렬을 진행.

 

👣 int overflow 대처 방안

예를 들어, int n = 10000000; long sum = n(n+1)/2; 와 같은 식이 int 끼리 연산 도중에 overflow가 발생해 값 왜곡이 생기는 경우가 있다.
이런 경우는 나는 2가지 방법으로 대처한다.

1. 형변환된 변수를 사용.

int n = 10000000;

long m = n;
long sum = n*(n+1)/2L;

2. 연산식 사이에 강제 캐스트 사용.

int n = 10000000;

long sum = (long) n * (n+1) / 2;

가독성을 위해 1번을 주로 사용하고 있다.

 

👣 유클리드 호제법

2개의 수의 최대 공약수를 찾기 위한 알고리즘.

int gcd(int a, int b) {
    // 더 큰 상수 찾기.
    int x,y;
    if(a > b) {
        x=a; y=b;
    }
    
    // 유클리드 호제법
    int tmp;
    while(y > 0) {
        tmp = x%y;
        x = y; y = tmp;
    }
    
    // 최대 공약수 출력
    return x;
}

 

👣 char -> String

char[] ary = {'a','b','c','d','e'};
String arrayString = String.valueOf(ary);
System.out.println(arrayString); // "abcde"
char cr ='A';
str = Character.toString(cr);

'TIL' 카테고리의 다른 글

WIL - 8/14 ~ 8/20  (0) 2023.08.20
8/19  (0) 2023.08.19
8/17  (0) 2023.08.17
8/16  (0) 2023.08.16
8/15  (0) 2023.08.15