Today's special moments become memories of tomorrow.

분류 전체보기 172

[백준 2630번] 색종이 만들기 (java)

2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. www.acmicpc.net 색종이를 계속 4등분으로 분할하여 모두 같은 색으로 이루어졌는지 아닌지를 확인하는 문제. 분할을 하면서 동일한 로직을 반복하기 때문에 재귀를 이용하여 해결할 수 있다. 재귀 문제는 항상 base case 즉, 탈출 조건이 무엇인지를 확인해야 한다. 이 문제의 base case은 다음과 같다. 1. 색종이의 크기가 1인 경우 색종이의 크기가 1이면 더 이상 분할이 불가능하므로 재귀를 종료한다. 2. 색종이의 크기가 1보다 크지만, 모두 ..

BOJ 2021.03.09

[백준 2263번] 트리의 순회 (java)

2263번: 트리의 순회 첫째 줄에 n(1≤n≤100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다. www.acmicpc.net 다음과 같은 트리가 있을 때, 인오더와 포스트오더로 나타내면 아래와 같다. InOrder : 4 - 2 - 5 - 1 - 6 - 3 - 7 PostOrder : 4 - 5 - 2 - 6 - 7 - 3 - 1 포스트오더로 나열하면 가장 오른쪽에 있는 값은 트리의 루트가 된다. 포스트오더는 왼쪽 노드 - 오른쪽 노드 - 가운데 노드 순서대로 순회하기 때문이다. PostOrder : 4 - 5 - 2 - 6 - 7 - 3 - 1 인오더에서는 루트를 기준으로 왼쪽은 왼쪽 자식 트리, 오른쪽은 오른쪽 자..

BOJ 2021.03.09

[백준 1992번] 쿼드트리 (java)

1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또 www.acmicpc.net 2차원 배열을 4등분으로 계속 분할해나가면서 푸는 문제이기 때문에 재귀를 이용하여 쉽게 풀 수 있다. quardTree() 라는 재귀함수를 만들어서 각 이차원 배열의 가장 왼쪽 위의 위치(r, c)와, 배열의 크기(size)를 인수로 입력받는다. -> quardTree(int r, int c, int size) 재귀의 base case는 언제인가? size = 1로, 더 이상 분할이 불가능한 경우 size가 1보다는 크지만, (r, c)를 가장 왼쪽..

BOJ 2021.03.09

현재 날짜, 시간 나타내기(SimpleDateFormat)

화면에 현재 날짜, 시간 정보를 나타내고자 할 때 SimpleDateFormat을 사용한다. System.currentTimeMillis()로 현재 날짜 혹은 시간에 대한 정보를 불러온다. var now = System.currentTimeMillis(); 현재에 대한 정보를 Date를 사용하여 변환한다. Date date = Date(now) SimpleDateFormat을 사용하여 현재 정보(날짜, 시간)를 어떻게 표시할지 문자열로 설정한다. 어떤 정보를 표시할지는 아래를 참고하길 바란다. 연도 : yyyy 월 : MM 일 : dd 시간 : HH(24시간), hh(12시간) 분 : mm 초 : s var sdf = SimpleDateFormat("yyyy/MM/dd") // 2021/03/08 var..

[Android] 안드로이드 생명 주기

안드로이드는 상태 변화가 있을 때마다 생명 주기 메서드를 호출한다. 사용자가 호출하는 것이 아니라 상태 변화에 따라 안드로이드가 자동으로 호출해주기 때문에 콜백 메소드이다. onCreate() 앱이 실행되어 액티티비가 생성되면 제일 먼저 onCreate()가 호출된다. 화면에 보이게 될 뷰를 설정하거나 초기화한다. onStart() onCreate()가 호출된 이후에 화면이 사용자에게 보여질 때 호출된다. 액티비티가 실행되면 onCreate() 다음에 onStart()가 호출된다.onCreate() -> onStart() onResume() 이 함수가 호출된 시점부터는 액티비티가 '실행 중'인 상태이다. 액티비티를 생성하면 다음과 같은 순서대로 메서드가 호출된다. onCreate() -> onStart(..

Android 2021.03.08

Null Safety : Null 안전하게 처리하기

코틀린은 자바보다 null에 대한 좀 더 세밀한 안정적인 처리가 가능한데, 이것을 Null Safety라고 한다. 코틀린의 Null Safety를 통해 NullPointerException이 생기는 것을 방지할 수 있다. Nullable : 물음표(?) nullable은 단어 그대로 변수에 null을 허용하겠다는 의미이다. [변수 선언] 코틀린에서는 기본적으로 변수를 선언할 때 다른 언어와 달리 초기값을 null로 하는 것이 불가능하다. 그러므로 변수에 null을 저장하고 싶다면 즉, null을 허용하고 싶다면 var variable : String? 이렇게 변수의 타입 뒤에 물음표를 추가해야 한다. [매개변수 선언] 메서드의 매개변수를 Nullable로 만들 경우에는 다음과 같다. fun nullabl..

Android/Kotlin 2021.03.08

[백준 8983번] 사냥꾼 (java)

8983번: 사냥꾼 KOI 사냥터에는 N 마리의 동물들이 각각 특정한 위치에 살고 있다. 사냥터에 온 사냥꾼은 일직선 상에 위치한 M 개의 사대(총을 쏘는 장소)에서만 사격이 가능하다. 편의상, 일직선을 x-축이라 가 www.acmicpc.net 이 문제는 이분탐색을 이용하여 해결할 수 있다. 사대의 위치를 arr 배열에 오름차순으로 정렬한다. 정렬 전 : 6 1 4 9 정렬 후 : 1 4 6 9 특정 동물의 위치에서 가장 가까운 사대의 위치를 이분탐색으로 찾는다. 이분탐색을 진행하는 방법은 다음과 같다. arr[middle] == x 이분탐색 범위(left ~ right)에서 arr[middle]가 동물의 x좌표와 일치한다면, 즉 사대가 같은 세로 일직선 상에 존재한다면 이 때의 사대가 동물과의 거리가..

BOJ 2021.03.08

[백준 2873번] 롤러코스터 (java)

2873번: 롤러코스터 첫째 줄에 가장 가장 큰 기쁨을 주는 롤러코스터는 가장 왼쪽 위 칸부터 가장 오른쪽 아래 칸으로 어떻게 움직이면 되는지를 출력한다. 위는 U, 오른쪽은 R, 왼쪽은 L, 아래는 D로 출력한다. 정답 www.acmicpc.net R : 홀수 OR C : 홀수 R, C 둘 중에 하나라도 홀수이면 모든 칸에 있는 기쁨을 다 더할 수 있다. 모든 칸을 다 방문할 수 있다. R : 짝수 AND C : 짝수 문제는 R과 C 둘 다 짝수인 경우이다. R과 C 둘 다 짝수인 경우에는 모든 칸을 다 지날 수 없기 때문에 기쁨의 합이 최대가 되는 방법을 생각해야한다. 처음에는 dfs를 이용하여서 모든 가능한 경로를 다 탐색한 후에 기쁨의 합이 최대가 되는 경로를 출력하도록 했었다. 그러나 결과는 '..

BOJ 2021.03.08

[백준 1080번] 행렬 (java)

1080번: 행렬 첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다. www.acmicpc.net A[r][c]에 대하여 A[r][c]!=B[r][c] 이면, (r, c)를 시작으로하는 3*3 행렬만큼 0은 1로, 1은 0으로 뒤집는다. 위 과정을 r = 0, c = 0 부터 마지막까지 반복한다. 이렇게 하는 이유는 만약에 A[0][0]!=B[0][0] 라면 B[0][0]와 같게 하기 위해 A[0][0]를 뒤집어야 한다. 그런데 A[0][0]를 뒤집기 위해서는 결국 (0,0)을 맨 왼쪽위로 하는 3*3 행렬만큼을 뒤집어야 한다. A[0][1]도 마찬가지이다. A[0][1]..

BOJ 2021.03.07

[백준 1201번] NMK (java)

1201번: NMK 첫째 줄에 세 정수 N, M, K가 주어진다. www.acmicpc.net 어려워서 오래 걸렸던 문제.. 다른 풀이를 참고해서 문제를 해결하였다. 해결 방법은 다음과 같다. 1. 1부터 N까지를 오름차순으로 정렬한다. (ex. N = 13, M = 5, K = 4) 2. 수열을 M묶음으로 나눈다. 이때 하나의 묶음에는 숫자가 K개 혹은 그 이하가 들어있어야 한다. 또한, 적어도 하나의 묶음은 K개의 수가 존재해야 한다. 3. M개의 묶음으로 나누었으면 각각의 묶음 내의 수들을 내림차순으로 정렬한다. M묶음으로 나누는 이유는 각각의 묶음에서 숫자 하나씩 선택을 하면 M개의 증가하는 수열을 만들 수 있다. 아래 그림에서 묶음1에서는 4를, 묶음2에서는 7, 묶음3에서는 8, 묶음4에서는 ..

BOJ 2021.03.07