| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- memory leak
- Inner Class
- programmers
- compose
- 알고리즘
- 구현
- broadcastAsUser
- ARRANGEMENT
- Android
- BFS
- hidden-api
- FCM
- Alignment
- JetpackCompose
- 삽질로그
- java
- 프로그래머스
- NextPermutaion
- Today
- Total
목록분류 전체보기 (10)
undefined
compose를 사용하다면 Column과 Row를 자주 사용하게 된다. 이 때 하위 뷰 들을 정렬하는 방식을 선택해야 하는데 종종 헷갈리는 옵션들이 있어서 정리를 해보기로 했다. Arrangement와 Alignment의 역할Arrangement와 Alignment은 역할에 차이가 있는데- Arrangement는 부모 내에서 자식들 간의 공간 배치를 설정하는데, 자식들 간의 간격을 설정하는데 많이 사용한다.- Alignment는 부모 내의 자식들을 정렬할 때 사용하는데, 위로 정렬, 가운데 정렬 처럼 자식들을 어떤 기준점에 맞춰 나열할 때 사용한다. ArrangementHorizontal Arrangement 은 Row에서 사용하며Vertical Arrangement 은 Column에서 사용한다 다음은..
내부 클래스(Inner class)를 사용할 때 주의해야하는 이유를 알아보자. 내부 클래스 종류 1. 정적 내부 클래스 (static) 외부 클래스 인스턴스가 아닌 클래스 자체에 속하는 클래스로 외부 클래스의 멤버 변수만 접근 가능하다. public class Outer { static class StaticInner { // ... } } 2. 멤버클래스 (non-static) 외부 클래스의 '인스턴스'에 속함. 외부 클래스의 모든 멤버에 접근 가능. 여기서 메모리 누수가 발생할 수 있다. public class Outer { class Inner { // ... } } 3. 지역클래스 지역변수처럼 함수가 실행되는 동안에만 사용 가능하다. public class Outer { void someMetho..
오류 해결을 위해 hidden-api 파일을 수정해야 했던 적이 있다. 검색을 해봤지만 의문투성이였던 이 파일의 역할을 정리해본다. hidden-api 를 검색하면 hidden-api.xml 파일은 Android 프레임워크에 포함된 Java API 중에서 개발자가 사용해서는 안 되는 API를 나열합니다. 이 파일에는 다음과 같은 API가 포함될 수 있습니다. 라고 나온다. 개발 중인 API 안정적이지 않은 API 향후 버전의 Android에서 제거될 API 를 정의하는 파일이라고 하는데.. 여기에 api를 정의하지 않으면 jar에서 api를 찾지 못했다. 이 당시 나는 굉장히 혼란스러웠는데 1. 왜... 프레임워크에 있는 소스 그대로 뽑아서 만든 jar파일인데 함수를 못찾아...? 2. 아니 사용하면 안..
시스템 애플리케이션, 그리고 일반 애플리케이션에서 동일한 동작을 수행하려고 할 때 '사용자' 에 따라서 권한 문제가 발생할 수 있다. 오류 해결을 위해 찾아봤던 내용들을 잊어버릴 것 같아 정리해두기로 했다. 오류 내용 : ~ android.permission.INTERACT_ACROSS_USERS_FULL~이었던 것 같다 서비스에서 브로드캐스트를 sendBroadcastAsUser(intent, UserHandle.USER_ALL)로 보내고 있었다. 이때 권한을 가지고 있지 않은 애플리케이션이 이 브로드캐스트를 받으면서 때 앱이 죽는 문제가 발생했다. 용어 이 오류를 해결하기 위해서 먼저 헷갈렸던 용어에 대해서 정리를 해보았다. 시스템 사용자 - 시스템 프로세스와 서비스가 사용하는 사용자 더보기 로그인한..
주어진 트리의 간선 하나를 끊어서 두개의 트리를 만드는데, 나눠진 두 트리의 노드 갯수를 최대한 비슷하게 만들었을 때, 두 트리의 노드 갯수 차이를 구하는 문제이다. 문제를 처음 봤을 때 hashmap이나 이차원 배열, 재귀 이 세가지 방법으로 풀 수 있을 것 같았다. 처음에는 문제를 꼼꼼히 안 읽어서 입력값이 [부모,자식] 인 줄 알았다. 입력값이 이차원 배열 형태인데, 각 노드의 숫자는 부모/자식 관계와는 상관이 없었다. 또, 노드 번호가 연속된다는 보장이 없다. 따라서 hashmap이나 Dequeue를 이용한 풀이가 더 효율적일것이다. (하지만 다시짜기 귀찮아..서.. 그냥 제출했다) 아무튼, 입력값을 받아서 노드들을 만들어주고, 연결해서 트리를 만든다음 첫번째 노드를 시작으로 트리를 순회하면서 각..
fcm 기능을 구현하면서 공식문서의 애매한 설명때문에 많은 시간을 날린? 나를 위해 구현했던 방법을 간략하게 정리해보려고 한다. FCM 메시지 유형 fcm은 알림 메시지(notification)과, 데이터 메시지(data) 두 가지를 지원한다. 공식문서에는 이 두 메시지의 차이를 이렇게 설명한다. 요약하자면, 메시지를 보낼 때 넘길수 있는 값은 "notification", "data"가 있는데, 앱이 백그라운드에 있는 경우 "notification"만 넘기거나, "notification" 과 "data"를 모두 넘기는 경우에는 onMessageReceived()가 호출되지 않는다 는 얘기다. (이걸 제대로 읽었어야 했다) 나는 백그라운드에서도 받은 데이터를 가지고 알림을 띄워주어야 했기 때문에 fcm메시..
원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 구하는 문제이다. 단순하게 구현하는 문제인 듯. fun solution(elements: IntArray): Int { val origin = elements + elements val temp = IntArray(elements.size) val caseSet = mutableSetOf() for (i in 0 until elements.size){ for(j in i until i+elements.size){ temp[j-i] += origin[j] } caseSet.addAll(temp.toSet()) } return caseSet.size } 문제를 풀고 다른사람 풀이를 보는데 slice랑 map을 사용해서 더 간결하게 푼 풀이를 발견..
class Solution { lateinit var map :Array val direction = arrayOf(Point(1,0), Point(-1,0), Point(0,1), Point(0,-1)) var answer = mutableListOf() fun solution(maps: Array): IntArray { map = Array(maps.size){IntArray(maps[0].length){-1} } for(r in 0 until maps.size){ for(c in 0 until maps[r].length){ val ch = maps[r][c] if(ch.isDigit()) map[r][c] = Character.getNumericValue(ch) } } for (r in map){ ..
알고리즘을 풀다 보면 순열,조합을 사용하게 되는 경우가 많다. 그 중에서도 순열/조합의 순서나 범위가 필요한 경우가 있는데, 이 때 NextPermutaion이 좋은 방법이 될 수도 있다. 컨셉은 모든 수를 정렬해 두고 맨 뒤부터 앞쪽을 이동하며 꼭짓점을 찾고,꼭짓점 앞의 수 'a' 와, 맨 뒤에서 부터 앞으로 하나씩 움직이며 첫번째로 만난 a보다 큰 수'b' 를 swap하면서 하나씩 값을 증가시켜서 모든 가능한 수를 만든다는 것이다. term1. 12345 가 있다면 맨 뒤에서부터 앞으로 움직이며 본인 앞의 수가 본인보다 작은 경우(꼭짓점)를 찾는다. 즉 여기서 number[i] == 5이고, a는 그 앞의 수인 4이다. 다시 뒤로 돌아가서 a보다 큰 수를 찾는다. 여기서 b는 5이다. a와 b의 자리..
근래 가장 나를 힘들게 했던 문제가 있었다. 아마 나중에 또 만나게 될 것 같아서 정리해보려고 한다. 이번에 구현해야 하는 기능 중 하나는 특정 주기마다 백그라운드에서 작업을 하고 완료되면 사용자에게 팝업으로 알리는 것이었다. 그냥 팝업을 띄우는 데 까지는 크게 어려움이 없었다. 하지만 해결하기 어려웠던 문제 중 하나가 바로 팝업이 중첩되었을 때 비정상적인 동작을 하는 것이었다. 대략, 특정 동작이 완료되면 -> 서비스를 실행하고, 조건에 맞는 분기를 타서 -> 뷰를 뿌려주고 -> 사용자의 동작에 따른 작업 + 뷰 닫기+ 서비스 종료 와 같은 프로세스를 타는 기능이다. 그런데 마지막 팝업의 닫기가 동작하지 않았다 (뷰의 다른 버튼들이나 창 드래그는 잘 됐다. 하지만 이 문제의 뷰는 재부팅 할 때 까지 사..