목록분류 전체보기 (392)
HTD
서론 안드로이드 어플을 구현하다보면, 뷰와 데이터 간의 일관성을 위해 의존성을 주입하거나 로직을 복잡하게 만들어야 하는 경우가 상당히 많았다. 하지만, 데이터바인딩을 사용하면 뷰에 들어가는 값이 항상 뷰모델의 값과 일치하게 하도록 할 수 있다. 값을 임의로 증가시켜도 뷰를 따로 업데이트해줄 필요가 없다. 게다가 뷰모델은 액티비티나 프래그먼트의 수명주기 전체를 scope로 두기 때문에, 화면을 회전하는 등의 행위가 있어도 따로 신경쓰지 않아도 된다. 그리고 데이터바인딩 라이브러리를 이용하면, 뷰의 클릭 이벤트(setOnClickListener)를 액티비티나 프래그먼트 클래스 파일 내에 지정하지 않아도 된다. xml 파일 내에 클릭 이벤트를 지정해줄 수 있기 때문이다. 액티비티 구성 맨 위는 +, - 버튼을..
문제 풀이 게시글을 줄여야겠다는 생각이 든다. 기발한 아이디어로 인한 것도 아니고 어려운 응용 문제도 아닌, 웰노운 문제에 대한 글을 쓸 때 점점 할 말이 없어지는 것 같기 때문..
https://www.acmicpc.net/problem/20312 20312번: CPU 벤치마킹 윤이는 Uni-COM에서 컴퓨터 부품을 판매하고 있다. 윤이는 다양한 성능의 CPU를 취급하는데, 손님들이 CPU의 성능을 손쉽게 비교할 수 있도록 벤치마크 표를 만들려고 한다. 모든 CPU 쌍을 직접 비교 www.acmicpc.net > 접근 표에서 row 단위로 묶어서 식을 계산할 때, (직전 row + 1) * (현재 row에 해당하는 입력값)를 계속해서 해주는 걸 알 수 있다. import sys input = sys.stdin.readline INF = 1000000007 def solution(): input() res = 0 prev = 0 for n in map(int, input().spli..
https://www.acmicpc.net/problem/1508 1508번: 레이스 첫째 줄에 N, M, K가 주어진다. N은 1,000,000보다 작거나 같은 자연수이고, M은 K보다 작거나 같다. 또, K는 2보다 크거나 같고, 50보다 작거나 같다. 둘째 줄에 심판이 있을 수 있는 K개의 위치가 주어 www.acmicpc.net > 접근 심판들의 거리가 '특정 값' 이상일 때 배치해야한다고 강제하고, 이 특정 값을 이분탐색으로 찾는다. 이분탐색의 범위를 0~N으로 두고, 이 범위 내에서 적절한 값을 찾아내야한다. 이를 위해선, start = mid + 1 또는 end = mid - 1를 언제 수행해야할지를 결정해야한다. 조금 추상적으로 생각해보면, mid값(=특정 값)이 너무 클 경우에는 심판을 ..
https://www.acmicpc.net/problem/6597 6597번: 트리 복구 창영이는 바이너리 트리를 매우 좋아한다. 그가 가장 좋아하는 게임은 바이너리 트리를 만들고, 노드에 알파벳 대문자를 하나씩 쓰는 것이다. 같은 알파벳을 여러 노드에 쓰지 않는다. 아래는 www.acmicpc.net > 접근 위 사진에서 preorder의 첫번째 문자열인 D를 통해, inorder에서 D가 루트 노드이며, ABC, EFG가 각각 left, right라는 것을 알 수 있다. 다음에는 두번째 문자열인 B로, ABC에서 B가 루트라는 것을 알 수 있다. 이러한 로직이 구조적으로 반복될 수 있다. 이를 기반으로 간단한 재귀 함수 하나를 짜면 다음과 같이 나온다. void f(int start, int end)..
https://www.acmicpc.net/problem/2487 2487번: 섞기 수열 A1, A2, …, AN으로 표시된 N 개의 카드를 정해진 방법으로 섞고자 한다. 그 섞는 방법은 1에서 N까지의 숫자로 이루어진 수열로 표시된다. 이 수열을 섞기 수열이라 하자. 섞기는 현재 가지고 있는 www.acmicpc.net > 접근 1, 3, 5를 보면, 1 - 3 - 5를 계속해서 반복한다. 2는 계속해서 2이며, 4, 6은 4 - 6을 반복한다. 이 사이클을 나열해보면 1, 2, 3이며, 이것은 6이라는 궤적으로 이어지는데 이 때 최소공배수(Least common multiple)가 쓰이는 것을 알 수 있다. 그럼 저 사이클의 길이만 세주면 된다. 사이클의 길이는 입력값(3, 2, 5, 6, 1, 4)..
> VideoView에 영상을 넣는 방법 get request에 대해 video를 response하는 url이 있다고 해보자. 이 때 VideoView에 이 링크의 영상을 띄우고자 할 때, 두 옵션이 있다. 첫번째는 Retrofit2를 이용하여 url에 get request를 보내 response를 얻어온 뒤, 이것의 바이너리를 임시 파일로 만들고 이 파일의 uri(Uri.fromFile())를 setVideoURI의 인자로 전달해주는 방법이다. 두번째는 영상 url를 setVideoPath나 setVideoURI의 인자로 넣어주는 방법이다. 이 때 후자의 경우, Uri.parse()를 이용하여 url을 uri로 바꾸는 과정이 필요하다. 하지만 이 두 방법은 완전히 동일하다. 왜냐하면, VideoView..
https://www.acmicpc.net/problem/12784 12784번: 인하니카 공화국 인하니카 공화국은 1번~ N번까지 N개의 섬으로 이루어진 나라이다. 이 나라에서는 섬 간의 왕래가 매우 어려웠지만, 위대한 다리 설계자 ‘진’이 두 섬을 연결하는 다리를 최소한의 개수로 만들 www.acmicpc.net > 접근 두 섬을 연결하는 다리를 최소한의 개수로 만들어 모든 섬 간의 왕래가 가능하도록 만들었다. 위 서술은 신장트리를 명시해주고 있다. 따라서 그래프를 탐색할 때 이전에 방문한 노드를 저장하고, 탐색 시 이전 노드를 블락해줌으로써 트리 탐색을 진행할 수 있다. 이제, 입력값을 트리라고 생각해보자. 초기에 f(1)을 넣으면 결과값이 나오는 방향으로 재귀함수를 구성한다. f(1)에서 해야하는..
https://www.acmicpc.net/problem/14942 14942번: 개미 자연수 n이 주어진다. n은 방의 개수이다. (1 ≤ n ≤ 105) 다음 n개의 줄에는 차례대로 현재 각각의 개미가 보유하고 있는 에너지 값이 주어진다. i+1번째 줄에는 i번째 방에 있는 개미가 가진 에너 www.acmicpc.net > 접근 각 노드에서 1까지 얼마나 걸리는지를 일일히 측정하면 N이 100000이므로 TLE에 걸린다. 따라서 '희소테이블'을 통해 1까지의 빠른 접근을 구현한다. > 풀이 우선 그래프를 마치 '무빙워크'처럼, 1로 향하게 되는 방향그래프로 만들어준다. 이를 위해서 1에서부터 시작하는 BFS를 한번 해준다. 이 때 이동 경로는 '무빙워크'의 반대방향일 것이다. 따라서 지나오면서 이용한..
https://www.acmicpc.net/problem/17612 17612번: 쇼핑몰 입력의 첫 줄에는 2개의 정수 N(1 ≤ N ≤ 100,000)과 k(1 ≤ k ≤ 100,000)가 주어진다. 다음 줄부터 N개의 줄에 걸쳐 고객 N명의 정보가 줄 맨 앞의 고객부터 맨 뒤 고객까지 순서대로 주어진다. i번째 www.acmicpc.net > 접근 아래와 같이 시간을 계속해서 누적시키면서 가장 시간이 적은 것들을 replace하는 방식으로 고민해보았다. 이 때 카운터에서 최소값을 계속해서 찾아야하므로 우선순위큐를 써야한다. 시간 중요하므로 time, id, index 순으로 tuple을 배치한다. 나는 입력값을 받으면서 같이 처리하는 식으로 설계하였는데, 방식은 대강 다음과 같다. toInsert라는..