[수강생회고]백엔드 개발 캠프 8기 4주차 회고


플레이데이터 백엔드 8기 주영찬님의 4주차 회고
스트림 API와 자료구조&알고리즘 학습일지


벌써 한 달

전반적인 느낀점 & 일주일 동안 한 일
이번 주는 예비군이 있어서 Linux 수업을 듣지 못했다. 
매일매일 배우는 내용이 많다 보니 복습하면서 못 들었던 수업내용을 따라가는 게 쉽지는 않은 듯..
그래서 리눅스는 나중에 시간이 나면 할 것 같다.

자바에서 끝내지 못한 부분을 끝내고 목요일에는 새롭게 자료구조와 알고리즘 수업을 들어갔는데 아무래도 자바와 아직 완전히 익숙하지는 않아서 함수들 기억하는 게 조금 힘들었다. 파이썬이라면 쉽게 해결할 문제도 언어가 바뀌니까 어려운 느낌이어서 앞으로 많은 연습과 공부가 필요하다고 느꼈다. 

백준도 자바용 아이디를 새로 만들어서 단계별로 풀어보기를 다시 푸는 중!
앞으로 쭉 쓰게 될 언어가 자바이다 보니 파이썬으로 알고리즘 공부는 일단 접어두고 계속 자바로 진행할 예정이다.
이번 주에 배웠던 내용을 간단하게 정리해 보겠다.


스트림 API

  • 스트림(Stream)은 데이터 소스(컬렉션, 배열 등)의 요소들을 연속적으로 처리할 수 있는 추상화된 개념이다. 
  • 스트림은 데이터를 직접 저장하지 않으며, 원본 데이터를 변경하지 않고 일련의 연산을 통해 결과를 생성한다.
  • 스트림은 한 번만 사용할 수 있다. 
  • 병렬 처리를 지원하여 성능을 향상 시킬 수 있다

스트림 사용 방법

- names.stream()으로 스트림을 생성.
- filter()로 "이"로 시작하는 이름만 필터링하고, map()으로 필터링 된 이름을 대문자로 변환한 후, forEach()로 출력한다.


중간 연산 (Intermediate Operations)
filter(Predicate<T>) : 주어진 조건에 맞는 요소만을 필터링
map(Function<T, R>) : 요소를 다른 형태로 변환
sorted() : 스트림의 요소들을 정렬
limit(long n) : 처음 n 개의 요소만을 포함하는 스트림을 반환
distinct() : 중복된 요소를 제거


최종 연산 (Terminal Operations)
forEach(Consumer<T>) : 각 요소를 처리
collect(Collector<T, A, R>) : 스트림의 요소들을 특정 자료구조로 수집
reduce(BinaryOperator<T>) : 스트림의 요소들을 결합하여 하나의 값을 반환
count() : 스트림의 요소 수를 반환
findFirst() : 첫 번째 요소를 반환
anyMatch(Predicate<T>) : 조건에 맞는 요소가 하나라도 있는지 확인


자료구조 & 알고리즘
자료구조와 알고리즘은 프로그래밍의 핵심이라고 할 수 있다. 
코드의 성능을 예측하고, 문제를 더 빠르고 효율적으로 해결할 수 있을 뿐만 아니라 코드 최적화와 성능을 개선할 수 있다. 
또한 면접 및 경력 발전에도 도움이 되며 창의적 문제 해결 능력을 기를 수 있다. 

알고리즘에는 시간 복잡도라는 개념이 나오는데, 시간 복잡도는 알고리즘이 입력 크기에 따라 시간이 얼마나 걸리는지 나타내는 척도이다.
주로 빅오 표기법(Big-O Notation)을 사용하여 표현한다. 알고리즘의 최악의 경우 성능을 나타냄.

시간 복잡도의 종류는 5가지가 있는데 

1. O(1) - 상수 시간 복잡도
2. O(n) - 선형 시간 복잡도
3. O(log n) - 로그 시간 복잡도
4. O(n^2) - 이차 시간 복잡도
5. O(2^n) - 지수 시간 복잡도

로 분류한다.


이번 주에 공부한 알고리즘은 2가지인데 구간 합 배열, 투 포인터 알고리즘이다.


구간 합 배열
구간 합 배열은 측정 구간의 합을 O(1)의 시간 복잡도로 빠르게 계산할 수 있다.


구간 합 배열 만들기
S[i] = S[i-1] + A[i] 

구간 합 계산하기
S[y] - S[x-1]


예시 코드



투 포인터 알고리즘
투 포인터 알고리즘은 두 개의 포인터를 사용해 배열이나 리스트를 효율적으로 탐색하는 기법.
사용하면 O(N)으로 성능을 개선할 수 있다.

출처: https://colabear754.tistory.com/69




4주차의 좋았던 점 & 잘했던 점
이번 주에는 거치대를 샀는데 시간이 지날수록 점점 장비들이 늘어나고, 더 공부에 몰입할 수 있는 환경이 되어간다는 점이 좋았던 것 같다.
알고리즘 공부를 하니까 진짜 공부를 하는 느낌이 들어서 더 열심히 해야겠다는 생각이 든다.


아쉬웠던 점
예비군을 다녀오느라 수업을 듣지 못했는데 밀린 강의를 듣지 못했다. 
다행히 리눅스 강의가 딱 하루짜리라 나중에 시간 내서 들으면 될 것 같다. 조금 더 체력 관리를 신경 써야 할 것 같다.


개선할 점
백준 알고리즘을 많이 풀어봐야 감이 생기고 익숙해질 것 같다. 강사님이 말씀해 주신 것처럼 30분까지만 생각해 보고 그래도 풀리지 않으면 구글링 or 인공지능을 활용해서 답을 본 후백지에 다시 작성해 보는 연습을 하면 좋을 듯.


다음 주 계획
백준에서 코딩 문제 하루에 한 문제 이상 풀기. 쉬운 문제라도 꼭 풀기.


벌써 한 달이라는 시간이 지났는데 체감상 3주? 정도 지난 느낌이 든다. 하루하루는 정말 길고 힘들지만, 돌이켜보면 금방 시간이 지나갔다. 
지금부터 배우는 내용은 중요하다고 생각이 들어서 복습을 놓치면 안 될 것 같고, 낭비하는 시간을 줄여야겠다.



영찬님의 더 많은 이야기가 궁금하다면?
👉플레이데이터 백엔드 8기 주영찬님의 블로그에서 확인해보세요!🚀
블로그 바로가기 / 3주차 회고 바로가기 ]