목록전체 글 (62)
코린이 탈출기
💡개요 성능개선을 위해 기존에 사용하던 RecyclerView를 DiffUtil + ListAdapter로 변경하는 작업을 진행하였는데, 변경하면서 어려웠던 점과 해결방안에 대해 기록해두려고 한다. RecyclerView를 사용하면서 어댑터에 변경사항을 알리기 위해 사용하는 notifyDataSetChanged() 함수를 매우 빠르게 자주 호출하게 되면 화면 내의 모든 항목이 한 프레임 내에서 다시 결합/배치되고 다시 그려지게 되는데, 이 때 리소스를 많이 사용하여 앱 성능이 현저히 떨어지게 되고, 결국에는 OOM으로 앱이 종료되는 현상이 발생했다. 이러한 현상은 사용자 경험에 큰 영향을 주기 때문에 꼭 수정이 필요한 부분이었다. notifyDataSetChanged()는 모든 항목이 새로 그려지게 되는..
한번에 20개의 gif를 가져오고 있는 현재 애플리케이션을 무한스크롤로 변경해보는 작업을 해보자 !! 이전 게시글 [RxJava] Giphy API를 활용한 gif 추천 애플리케이션 (2) 이전 게시글에서는 RxJava를 사용하여 Giphy API로 랜덤으로 받아온 gif를 recyclerView에 띄워주는 방법에 대해 다루어 보았다. Giphy API 사용법: https://developers.giphy.com/docs/api/endpoint/#trending 이.. ekdbsl22.tistory.com 무한 스크롤이란? 1. recyclerView로 보여줄 목록을 구현하고 (이전 게시글에서 작업한 부분) 2. 스크롤이 끝에 닿았을 경우 새로운 데이터를 불러온다. 3. 새로운 데이터를 adapter 통..
이전 게시글에서는 RxJava를 사용하여 Giphy API로 랜덤으로 받아온 gif를 recyclerView에 띄워주는 방법에 대해 다루어 보았다. Giphy API 사용법: https://developers.giphy.com/docs/api/endpoint/#trending 이번에는 사용자가 검색한 키워드에 대한 검색 결과를 나타내볼텐데, throttling과 debouncing 두가지 방법으로 구현해보고 차이점에 대해서도 다루어보려고 한다. 예를 들어, 사용자가 "hello" 라는 키워드의 gif들을 검색하는 경우를 생각해보자. 검색창의 text가 변경될 때마다 서버로부터 search 결과를 요청한다면, "h", "he", "hel", "hell", "hello" 각 text에 대한 결과를 모두 요청..
이번 RxJava 스터디에서 토이 프로젝트로 Giphy API를 이용해서 gif 추천/검색 등 다양한 기능을 하는 앱을 만들어보려고 한다. RxJava를 익히기 위해서 만들어보는 거라서 아주 잡다한 기능이 많이 추가될 예정 .. Giphy API는 RESTful API로, 여러가지 gif들을 api 형식으로 제공해주고 있다. https://developers.giphy.com/docs/api/endpoint/#trending 해당 문서를 참고하면 된당 먼저 사용해볼 api는 random api! 말그대로 랜덤으로 gif를 반환해준다. 이 api로 우선은 랜덤으로 10개의 gif를 받아와서 recyclerView를 통해 띄워보도록 하쟈 프로젝트 구성 data: gif data 클래스 패키지 di: dagg..
문제 바로가기 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net Algorithm Dynamic Programming Logic 스티커를 고르는 경우는 i번째 위치에서 위를 선택/아래를 선택/고르지 않기 세 가지 경우이다. 그 전에 위에 있는 스티커를 골랐다면, 현재 위치에서도 위의 스티커는 고를 수 없다. 그 전에 아래에 있는 스티커를 골랐다면, 현재 위치에서도 아래의 스티커는 고를 수 없다. 이렇게 불가능한 경우에 유의하면서 코드를 작성하면 된다. *핵심코드 for i in range(1, n+1..
클로저 개념 클로저는 내부함수가 외부함수의 맥락(Context)에 접근할 수 있는 것을 가리킵니다. 클로저는 자바스크립트를 이용한 고난도 테크닉을 구사하는 데에 필수적인 개념으로 활용되므로 중요합니다. 흔히, 함수 내에서 함수를 정의하고 사용하면 클로저라고 합니다. 클로저 안에 정의된 함수는 만들어진 환경을 기억한다는 특징이 있습니다. var base = 'Hello, '; function sayHelloTo(name) { var text = base + name; return function() { console.log(text); }; } var hello1 = sayHelloTo('A'); var hello2 = sayHelloTo('B'); var hello3 = sayHelloTo('C'); h..
호이스팅의 개념 함수 안에 있는 선언들을 모두 끌어 올려서 해당 함수 유효범위의 최상단에 선언하는 것을 의미합니다. 자바스크립트 Parser가 함수 실행 전에 해당 함수를 한번 훑고, 이 함수 안에 존재하는 변수/함수 선언에 대한 정보를 기억하고 있다가 실행하는 것입니다. 이 때 유효범위의 의미는 함수 블록 {} 입니다. 즉, 함수 내에서 아래쪽에서 선언되어지는 부분을 미리 다 선언해놓는 것이죠. 실제로 코드가 끌어올려지는 것은 아니고, 자바스크립트 Parser가 내부적으로 끌어올려서 처리하는 것입니다. 호이스팅의 대상 var 변수 선언과 함수 선언문에서만 호이스팅이 일어납니다. var 변수/함수선언만 위로 끌어올려지고, 할당은 끌어올려지지 않습니다. let/const 변수선언과 함수표현식에서는 호이스팅..
문제 바로가기 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 1. DP 풀이법 현재 num과 이전의 값들의 비교하는데, 이전 값보다 현재값이 크다면 그 dp배열의 현재 값과, dp배열의 이전 값 + 1 중 더 큰 값으로 갱신한다. dp의 최댓값이 답이다. N = int(input()) number = [int(x) for x in input().split()] dp = [1] * N for i in range(N): for j in range(i): if number[j] < number[i]: dp[i] =..