본문 바로가기

내일배움캠프 안드로이드 3기

(68)
[TIL] 24.04.30 앱 개발 숙련 주차 팀 프로젝트 회고 저번 주는 내내 팀 프로젝트를 진행했고, TIL을 거의 작성하지 못했다. 그래서 과정부터 소감까지 한 번에 결산 회고로 작성하기로 했다.   📝진행과정   이번에 구현할 앱은 연락처 앱이었고, 각 화면 별로 몇 가지 상세한 요구사항을 염두에 둔 채로 인원을 배분했다. 와이어 프레임을 대강 작성해 두고, 일단 필수 기능들부터 나누어서 작업하기로 했다.   위의 붉은 사각형으로 하이라이트 된 부분이 처음 계획했던 팀 플랜이다. 수요일까지 필수 기능을 구현해서 PR을 진행하고, 목요일에 코드 리뷰 및 리팩터링을 마무리해 병합 후 추가할 기능을 선정해 금요일까지 마무리할 요량이었다. 물론, 계획대로 흘러가지 만은 않았는데, 이번 프로젝트는 우여곡절이 좀 있었다. 일단 이 캠프에는 아직 숙련도가 부족해서, 본인..
[TIL] 24.04.25 RecyclerView 아이템 내의 Switch 일관성 문제 1. RecyclerView 아이템 내의 Switch 일관성 문제  RecyclerView를 사용하다 보면, View의 재활용 과정에서 의도하지 않은 속성값 찌꺼기가 남아있는 일들이 생긴다. 물론 일반적인 TextView의 text 등의 경우, 직접 상태값을 바인드하게 되니까 별 문제가 발생하지 않지만, 문제는 여러 상태 값을 가진 객체나 리스너 등을 이용하는 경우다.  이번에 챌린지반 과제를 하면서, 아래처럼 Switch 위젯을 이용해 북마크 토글을 만들었는데 여기서 문제가 생겼다.  로직은 심플한데, 일단 각각의 Switch에 대해 OnCheckedChangeListener를 달아서 Switch의 상태 값이 변경되면 어댑터에서 받아온 콜백을 부른다. 이 콜백은 Fragment에서 주입 받은 것으로 V..
[TIL]24.04.19 알고리즘, 기타 1. 알고리즘 문제 해결 인공지능 테트리스 (Large) (백준 14599): 핵심은 시뮬레이션 구현이었고, 그 내부에서 BFS/DFS나 그리디 등을 사용할 수 있는 문제였다. 아무래도 구현이 주가 되는 문제이다 보니 로직 자체는 심플하다. 대신에 세심하게 체크하지 않으면 놓치기 쉬운 부분이 많다. 나도 그래서 3번 정도의 시행착오를 거쳐야 했다. 로직은 문제 그대로 구현하면 된다. 각 종류별 테트로미노들이 회전 없이 내려갈 때, 테트로미노 하나만을 이용해 제거할 수 있는 최대 줄 수를 구하면 된다. 나 같은 경우에는, 먼저 테트로미노들을 표현할 수 있게 각각의 회전케이스들을 포함해 미리 구현했다. 한 점을 기준으로 테트로미노를 가장 좌측 상단 구석까지 당겨 붙인다고 생각한 뒤에, 테트로미노를 구성하는 ..
[TIL] 24.04.18 알고리즘 1. 알고리즘 문제 해결 2x2x2 큐브(백준 16939): 단순 구현 문제. 이건 사실 왜 골드2로 책정된건지 조금 의아했다. 잘쳐줘도 실버 하위정도의 난이도를 가진 문제같은데.. 한 번 돌려서 풀 수 있는지를 묻고 있기 때문에, 단순 구현으로 빠르게 처리할 수 있다. 각 축에 대해 한 쪽을 시계방향으로 회전하는 경우와 반시계방향으로 회전하는 경우, 그래서 따져봐야하는 경우는 6가지이다. 축 별로 한쪽 방향 회전을 만들어둔 후, 세 번 반복하면 반대쪽 방향 회전한 결과와 같기 때문에 그걸 이용해서 풀어도 되지만, 그렇게 하려면 각 칸 배열의 수들을 옮기는 회전 함수를 이용해야 한다. 하지만 굳이 배열에 매번 바뀌는 값을 assign해서 상태를 검사하는 것보단, 단순하게 6가지 케이스들은 초기 배열을 이..
[TIL] 24.04.17 알고리즘, Activity와 Fragment 전환 시 생명주기 차이 1. 알고리즘 문제 해결 퍼즐(백준 1525): BFS 문제이긴 한데, 학교 알고리즘 수업을 들을 때 비슷한 문제를 A* 알고리즘을 적용해 풀었던 기억이 있어서 A* 알고리즘으로 풀어보았다. A* 알고리즘 f(x) = g(x) + h(x)라고 하고, h(x)를 휴리스틱 함수라고 할 때, g(x)는 현재까지의 이동 횟수로, h(x)는 완성된 퍼즐과의 일치 정도로 설정했다. 메모리 제한이 32MB로 꽤나 빠듯하기 때문에, 탐색 과정에서 퍼즐정보를 2차원 정수 배열로 담았다간 우선순위 큐에 원소가 쌓이며 메모리 초과가 나기 십상일 것이다. 그래서 어떡할까 하다가 문자열을 이용하기로 했다. 9글자짜리 문자열은 비교적 적은 메모리를 차지할 것이라고 생각했기 때문이다. 만약 그럼에도 초과가 난다면 Int형 하나만 ..
[TIL] 24.04.16 알고리즘, 앱개발 숙련 주차 개인과제 제출 1. 알고리즘 문제 해결 정육면체 전개(백준 1917): 구현 문제였는데 말끔한 로직을 떠올리기 쉽지 않았다. 주어진 전개도에 대해 정육면체의 전개도임을 판별할 수 있는 수식이 떠오르지 않았기 때문이다. 둘레부터 시작해서, 모서리의 수, 전개도 내의 배열의 특징성 등을 떠올려봐도 정육면체의 전개도만을 판별해낼 수 있는 일반화된 식은 전혀 없었다. 그래서 시뮬레이션 방식으로 답을 찾아나가는 법 밖에는 없었다. 일단 어느정도 복잡도를 가진 로직을 사용할 지는 몰랐지만, 아무래도 2차원 배열로 데이터가 주어지고 그 중 정사각형이 존재하는 부분만 이용하게 될 것 같았고 그렇다면 DFS/BFS와 같은 탐색류가 메인이 될 가능성이 높아보였다. 입력 데이터의 크기는 항상 6*18의 작은 크기로 주어지므로, 설령 완전..
[TIL] 24.04.15 알고리즘, 앱개발 숙련 주차 개인과제 1. 알고리즘 문제 해결 Ah-Choo!(백준 15822): DP 문제이다. 점화식을 찾는 것이 제일 까다로웠다. 처음에 두 파형에 대해서 대응되는 시점을 지정하는 과정을 잘못 이해해서 시간을 더 쓰게 된 것 같다. 시점이 N개이면 대응 관계도 N개만 존재해야 하는 줄 알았는데, 문제를 다시 읽어보니 그런 제한은 명시돼있지 않았고, 오히려 각 시점은 하나 이상의 대응되는 시점을 가져야 한다는 조건이 핵심이었다. 그렇게 생각한다면, 점화식을 찾기 한결 편해진다. 파형 X의 시점 i와 파형 Y의 시점 j를 대응시킨다고 생각하면 고려할 경우는 세 가지이다. - 파형 X의 시점 i-1과 파형 Y의 시점 j-1이 대응되었던 경우 - 파형 X의 시점 i-1과 파형 Y의 시점 j가 대응되었던 경우 - 파형 X의 시점..
[TIL] 24.04.11 알고리즘, 개인 과제 Dialog 에러 1. 알고리즘 문제 해결 연속합 2(백준 13398): 브루트 포스로 구한다면 O(n^2)의 시간복잡도를 가지기 때문에, 시간 제한 내로 풀 수 없다. DP를 이용해야 하는 문제. 수열에서 수를 하나 제거할 수 있다는 조건 때문에, 1차원 배열 하나로는 풀 수 없고 1차원 배열 두 개를 이용해야 한다. 하나는 일반적인 경우의 연속합을 계산해 저장하고, 하나는 수를 하나 제거했을 때의 연속합을 저장한다. 먼저 일반적인 경우의 연속합은 max(이전까지의 연속합+탐색중인 수, 탐색 중인 수)로 구할 수 있다. 이전까지의 연속합이 음수라면 현재 탐색 중인 수부터 새로 연속합을 구하는 것이 optimal한 값이기 때문이다. 두번째로 수열에서 수를 하나 제거한 경우의 연속합은, max(이전까지의 연속합, 이전까지의..