코딩테스트 stream , AtomicInteger 사용

장숭혁·2023년 11월 18일
0

TIL작성

목록 보기
21/60
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
            AtomicInteger index = new AtomicInteger();
            return Arrays.stream(absolutes).reduce(0, (i, i1) -> {
                index.getAndIncrement();
                return signs[index.get() - 1] ? i + i1 : i - i1;
            });
        }
 }

음양더하기 문제에서 다른 사람들이 풀어 놓은 것을 보았는데 그 중 눈에 띄는 답을 보았다.
AtomicInteger와 Stream의 reduce() 함수를 이용해서 문제를 풀이했는데
참고로 나의 코드는

for(int i=0;i<absolutes.length;i++){
          if(signs[i] == false){
              absolutes[i] = -absolutes[i];
          }
          answer += absolutes[i];
      }

이러하였다. stream을 이용해서 풀려고 하였는데 아직 능숙하지 않아 생각나지 않았다.

먼저 Arrays.Stream(absolutes).reduce()는 초기값을 0으로 설정한뒤 i와 i1을 설정해 주는데 i는 reduce의 현재 람다 함수를 통해 축적된 값이고, i1은 배열의 그 index의 들어있는 value이다.

이를 통해서 i의 값을 축적하면서 i1로 값을 빼거나 더함을 알 수 있다.

  • AtomicInteger는 멀티쓰레드 환경에서 안전하게 정구 값을 증가 또는 감소시킬 수 있는 클래스이다. 원자적인 연산을 지원하고 동시에 여러 쓰레드에서 해당 값을 안전하게 조작할 수 있도록 한다.

🔘 AtomicInteger index = new AtomicInteger();

  • 초기값이 0인 AtomicInteger값을 생성한다.
  • 초기값을 설정해 줄 수 있다.

🔘 index.get()

  • 현재 AtomicInteger 값을 반환한다.
  • void set(int newValue) : AtomicInteger 의 값을 주어진 값으로 설정한다.

🔘 원자적 연산 :

  • index.getAndIncrement() : 현재 값을 가져온 후 1을 증가시킨다.

    • index++; 와 비슷하다.
  • index.getAndDecrement() : 현재 값을 가져온 후 1을 감소시킨다.

    • --index; 와 비슷하다.
  • index.incrementAndGet() : 1을 증가시킨 후 값을 반환한다.

    • ++index; 와 비슷하다.
  • index.decrementAndGet() : 1을 감소시킨 후 값을 반환한다.

    • --index; 와 비슷하다.

🔘 값 변경 및 조작 :

  • index.addAndGet(int delta) : 주어진 값을 현재 값에 더한 후 반환한다.
  • boolean compareAndSet(int expect, int update) : 현재 값이 기대하는 값과 같으면 업데이트 값을 설정한다.

🔘 기타 메소드 :

  • index.getAndSet(int newValue) : 현재 값을 가져온 후에 주어진 값으로 설정한다.
  • String toString() : 현재 AtomicInteger의 문자열 표현을 반환한다.
profile
코딩 기록

0개의 댓글

관련 채용 정보