본문 바로가기

분류 전체보기

(159)
[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.12 알고리즘, 앱개발 숙련 주차 개인과제 1. 알고리즘 문제 해결 구간 나누기(백준 2228): 일정 난이도를 넘어가기 시작하면 주어지는 n이 작을 때가 더 두렵다. 단순하게 로직하나 돌려서 끝나지 않고, 완전탐색이나 다른 탐색류 알고리즘이 더해지는 경우가 많아서다. 이번 문제는 큰 틀이 dp라는 것을 파악하는 데는 어려움이 없었지만, 그래서 결국 복수개의 구간합을 어떻게 dp로 풀어낼 것인지가 아리송했다. 주어진 배열 내에서 하나씩 순회해가며 탐색 중인 인덱스를 기점으로 구간이 0~M개까지 선택되는 경우을 찾아야 하는 것은 분명했다. 여기서 dp라는 틀에 얽매여서, Bottom-Up Approach만 떠올리느라 한참 시간을 보낸 것 같다. 긴 고민 끝에 풀어낸 방법은 오히려 Top-Down Approach를 이용하는 것이었다. N*M 크기의 ..
[TIL] 24.04.11 알고리즘, 개인 과제 Dialog 에러 1. 알고리즘 문제 해결 연속합 2(백준 13398): 브루트 포스로 구한다면 O(n^2)의 시간복잡도를 가지기 때문에, 시간 제한 내로 풀 수 없다. DP를 이용해야 하는 문제. 수열에서 수를 하나 제거할 수 있다는 조건 때문에, 1차원 배열 하나로는 풀 수 없고 1차원 배열 두 개를 이용해야 한다. 하나는 일반적인 경우의 연속합을 계산해 저장하고, 하나는 수를 하나 제거했을 때의 연속합을 저장한다. 먼저 일반적인 경우의 연속합은 max(이전까지의 연속합+탐색중인 수, 탐색 중인 수)로 구할 수 있다. 이전까지의 연속합이 음수라면 현재 탐색 중인 수부터 새로 연속합을 구하는 것이 optimal한 값이기 때문이다. 두번째로 수열에서 수를 하나 제거한 경우의 연속합은, max(이전까지의 연속합, 이전까지의..
[TIL] 24.04.09 알고리즘, 앱개발 숙련 주차 1. 알고리즘 문제 해결 LCS 2(백준 9252): 오랜만에 따로 알고리즘 문제를 풀었다. 캠프의 루틴에 따라 매일 매일 프로그래머스의 알고리즘 문제를 하나씩 풀고있긴 하지만, 결이 좀 다르다. 제시된 문제들이 비교적 간단하고, 백준 문제들처럼 입력과 출력, 제한 시간 및 메모리 등이 확실하게 주어지지 않는 문제도 많아서 알고리즘 사고를 연습하기 보다는 코틀린에 더 익숙해지는 용도로 쓰고 있다. 한동안 팀 프로젝트를 진행하느라, 개인적으로 이렇게 알고리즘 문제를 풀지 못했는데 오랜만에 푸니까 더 재밌게 느껴지는 것 같다. 이 문제는 알고리즘 과목을 수강하면 DP를 배우면서 한번쯤은 공부하는 문제가 아닐까 생각한다. 브루트 포스로 해결하자면 각각의 문자열의 길이가 n과 m이라고 했을 때, 시간복잡도가 O..
[TIL] 24.04.08 팀 프로젝트 회고 1. 팀 프로젝트 팀 프로젝트가 우여곡절 끝에 마무리 됐다. 완벽한 완성도는 아니었지만, 의미 깊은 프로젝트였다고 생각한다. 발표를 위해 만들어둔 프레젠테이션 자료를 보며 되돌아볼까 한다. 일단 목표가 여기 적어둔 것처럼, 온전한 팀 프로젝트를 경험하는 것에 초점을 맞췄다. 그래서 팀원들에 여건에 맞춰 적용할 기술을 선택했고, 구현할 기능도 욕심내지 않았다. 역할 배분에 내 의견이 많이 반영됐는데, 그래도 팀원들이 모두 본인 역량을 조금 웃도는 수준으로 경험하면 좋겠다 싶어서 그 정도의 선을 기준으로 분배했다. 내가 처음 안드로이드를 공부할 때 그게 도움이 많이 됐기 때문인데, 러닝 커브가 가파르니까 일단 부딪혀서 조금 어렵다 싶은 것들을 어떻게든 해내다 보면 지나고 봤을 때 많이 성장해 있었던 것 같다..
[TIL] 24.04.04 팀 프로젝트, 챌린지반 과제 1. 팀 프로젝트 오늘 늦은 저녁이 돼서야 병합에 성공했다. 디테일한 부분 픽스는 미루고 주요 로직들이 돌아가게 하는 것을 우선으로 해서 병합했다. 아무래도 남은 기간이 얼마 남지 않았고, 슬슬 남은 필수 구현 사항을 적용하고 모든 코드가 병합된 채 점검해야하는 것들이 있었기 때문에 어쩔 수 없는 선택이었다. 그래도 일단 코드 리뷰를 꽤나 열심히 진행해서, 큰 결함은 없는 상태로 병합할 수 있었다. 그리고 다음 단계로 나아가기 위해 다시 각각 파트를 나누었다. -UI수정 및 UI 위주의 부가기능 구현 -유저 등록하는 시스템 및 로그인 시 실제 검증 절차 적용하기, String 리소스 수정 -각 액티비티 간 전환 시에 트랜지션 적용하기( overridePendingTransition()을 이용하라고 했는데..