잡담
나 자신을 알기
30살. 앞자리 숫자가 바뀌니 뭔가 20대 때와는 다르게 살아야 할 것 같은 압박감이 듭니다. 다르게 살아가기 위해서 나라는 존재에 대해 돌아보는 시간을 가졌습니다. 나는 사회적으로 어떤 사람이고 무엇을 잘하고 무엇을 못하는지에 대해서.질투심인간을 제외한 다른 동물들은 질투심을 느낄까요? 사전적 정의로 질투란 '다른 사람의 좋은 일을 미워하거나 나 자신에 대한 우려, 두려움, 불안을 느끼는 것'이라고 합니다. 즉, 사회적인 현상 속에서 발생하는 복잡하고도 자기중심적인 감정이죠. 사람이라면 주기가 다를 뿐, 누구나 질투를 하지 않을까요. 저는 그 주기가 잦은 것 같습니다. 좋게 본다면 갈망이고 나쁘게 본다면 결핍이죠.이기적동물은 모두 이기적인 방향으로 진화하고 인간도 마찬가지입니다. 하지만 사회에서 이기적..
leetcode 1361. Validate Binary Tree Nodes
문제 이해 주어진 그래프가 B-Tree인지 체크하는 문제 문제 접근 그래프가 B-Tree인지 확인하려면 Circular Reference가 없어야 한다. 루트 노드가 반드시 하나 존재해야 한다. 모든 노드는 하나의 부모 노드만 가져야 한다. 루트 노드부터 시작하여 모든 노드를 탐색할 수 있어야 한다. (연결) 그래프가 B-Tree인지 확인하는 조건들은 예시를 분석하며 빠르게 접근할 수 있었지만 표현에 서툼이 있었음. Try 1. B-Tree를 구성하며 조건 체크 코드를 작성하다보니 시간복잡도가 O(n^2)까지 치솟았다. 노드의 개수가 최대 10^4개이기 때문에 시간복잡도에서 해결될 수 없어서 포기했다. Try 2. Graph를 미리 만들고 조건을 검사 그래프를 만들고 난 후에 검사를 하게 되면 각 조건 ..
leetcode 746. Min Cost Climbing Stairs
문제 이해 계단을 끝까지 올라가기 위해 필요한 최소 비용을 구하는 문제 각 계단의 비용은 int[] cost 에 저장되어 있음 문제 접근 계단을 올라가는 경우의 수가 많고 딱히 수학적 규칙이 떠오르지 않으니 완전 탐색을 시도 dfs를 활용하여 완전 탐색 시도 1. dfs로 접근 완전 탐색은 성공적이였지만 시간 초과 발생 class Solution { int answer = Integer.MAX_VALUE; public int minCostClimbingStairs(int[] cost) { dfs(cost, -1, 0); return answer; } void dfs(int[] cost, int idx, int sum) { int newSum = sum; if(idx != -1 && idx != cost...
leetcode 1095. Find in Mountain Array
문제 이해 Mountain Array가 주어지고 해당 배열에서 target을 찾는 문제 (여러 target 값이 존재한다면 index가 제일 낮은 값을 찾으면 된다.) 제한 조건으로는 Mountain Array를 100번 이하로 접근해야 한다. 문제 접근 상승 배열과 하강 배열이 합쳐져있는 형태이며 target을 찾기 위해 binary search를 활용하면 될 것이라고 생각 binary search를 활용하기 위해서는 상승 배열과 하강 배열로 나누는 top (변곡점)의 index 값을 찾아야함 target이 2개 존재할 수 있기 때문에 상승 배열에서 먼저 찾아보고 하강 배열에서 찾아보면 된다. 결과적으로 이 문제는 변곡점을 찾는다. target을 찾는다. 두가지 과정이 필요하다. 복잡도 예상 변곡점 t..
프로그래머스 - 괄호 회전하기
https://school.programmers.co.kr/learn/courses/30/lessons/76502 문제 이해 주어진 문자열 s의 맨 앞 문자를 맨 뒤로 이동시켜서 주어진 조건에 만족하는 케이스가 몇 개인지 체크하는 문제 풀이를 위한 고민 문제에서 알려준대로 실제로 문자열을 조작(회전)시키면서 조건을 검사해볼거냐 회전을 하지 않아도 풀 수 있는 방법이 있지 않을까? 실제로 문자열을 조작해서 조건 검사하는 직관적인 풀이로 접근해보기로 결정. 코드 구상 문자열 맨 앞 문자를 맨 뒤로 이동시키기 위해 Queue를 활용해보자 -> 삽입에 O(n) 소요 괄호 검사를 위해서 check 함수를 정의하자 문자열을 한 바퀴 돌아야 하기 때문에 O(n) 소요 s의 길이만큼 체크를 해야하기 때문에 결국 O(n..
프로그래머스 - 징검다리 건너기
https://school.programmers.co.kr/learn/courses/30/lessons/64062 설명 그대로 풀기 설명 그대로 니니즈 친구들을 하나씩 보내보면서 해답을 찾는다. For 문을 2회 돌리는 방식 제한사항을 읽었을 때, 설명 그대로 풀게 되면 stones의 각 원소 값이 2억이므로 2억번 for loop를 돌 가능성이 있다. 하지만 딱히 다른 방법이 생각나지 않았기에 일단 그대로 풀어보기로 함. Code class Solution { public int solution(int[] stones, int k) { int answer = 0; int n = stones.length; while(true) { for(int i = 0; i < n; i++) { for(int j = ..
Leetcode 392. Is Subsequence
https://leetcode.com/problems/is-subsequence LeetCode - The World's Leading Online Programming Learning Platform Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 문제 이해 두 문자열 s, t가 주어지고 s가 t의 subsequence이면 true 아니면 false 반환 문자열에 상대적인 순서를 해치지 않고 문자열을 제거했을 때 만들어지는 문자열을 subsequence라고 함 사고 흐름 문자열..
LeetCode 847. Shortest Path Visiting All Nodes
https://leetcode.com/problems/shortest-path-visiting-all-nodes/ LeetCode - The World's Leading Online Programming Learning Platform Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이 시간 2시간정도.. ㅠㅠ 문제 이해 그래프에서 모든 노드를 방문할 때 필요한 최소 비용(간선 사용 횟수) 사고 흐름 최소 비용이라고 해서 Node to Node weight map을 구하고 외판..
플러터 프로젝트에 코드매직으로 CICD 도입하기
진행하고 있는 앱 서비스의 규모가 커지고 이해관계자가 다양해지고 많아짐에 따라 그동안 수동으로 진행했던 배포를 자동화해야 하는 필요성을 느꼈습니다. 회사 내부에서 파이어베이스 배포 서비스를 이용하여 내부 테스터들에게 앱을 배포하고 있는데 잦은 빌드 잦은 배포로 인해 업무의 효율성이 낮아졌기 때문이지요. 사내에서는 프로젝트 원격 저장소로 빗버킷을 이용하고 있기에 CI/CD 구축을 위해 빗버킷에서 제공하는 파이프라인을 사용할 수 있었지만 파이프라인은 리눅스 환경에서 돌아가기 때문에 iOS 앱을 빌드할 수 없었습니다. 따라서 남은 선택지는 1. macos 빌드 환경을 자체 구축한다 2. 외부 CICD 서비스를 이용한다 였고, 빠르게 구축하기 위해 돈을 주고 외부 CICD 서비스를 이용하기로 결정하였습니다. 저..
배포는 미리미리
플레이스토어에 앱을 배포하면서 처음으로 고통을 받았습니다. 원래라면 공개/비공개 테스트에서 검토를 한번 받고 프로덕션으로 트랙을 변경해서 빠르게 올리는게 배포 전략이었는데, 검토 기간이 예상 외로 길어지면서 일이 꼬이고 말았죠. 사업부에서는 업데이트 언제 되냐고 계속 물어보시고.. 저는 처음 겪는 일이라 일단 구글에 문의를 해보겠다 조금만 기달려달라고만 대답했습니다. '혹시 다시 새 버전으로 출시하면 심사 대기열의 앞 쪽으로 배치받지 않을까?' 라는 잘못된 판단으로 새 버전을 계속해서 올렸고 그 결과는 참담했습니다.. 알고보니까 이전에 심사가 완료되지 않은 것이 있다면 이전 것은 제쳐두고 마지막 제출된 사항으로 다시 재검토를 시작한다고 하더군요.. 구글에 문의한 답변을 읽고 처음 알았습니다. 어쨋든 러프..