N과 M (1) 문제 풀이 언어 Kotlin 코드 import java.util.* lateinit var visit: Array lateinit var input: Array var n: Int = 0 var m: Int = 0 fun main() = with(Scanner(System.`in`)) { n = nextInt() m = nextInt() visit = Array(n + 1) { 0 } input = Array(n + 1) { 0 } dfs(0) } fun dfs(depth: Int) { if (depth == m) { for (i in 0 until m) { print("${input[i]} ") } println() return } for (i in 0 until n) { if (vis..
문제 풀이 언어 Kotlin 코드 class Solution { fun solution(s: String): IntArray { val string = s.slice(2 until s.length - 2) val array = string.split("},{") val sortedArray = array.sortedBy { it.length } val answer = mutableListOf() for (e in sortedArray) { val splitString = e.split(',') for (num in splitString) { if (answer.contains(num.toInt()).not()) answer.add(num.toInt()) } } return answer.toIntArray..
문제 풀이 언어 Kotlin 코드 import java.util.* class Solution { fun solution(places: Array): IntArray { val answer = mutableListOf() val size = places.size for (place in places) { var check = 0 for (i in 0 until size) { for (j in 0 until size) { if (place[i][j] == 'P') { if (bfs(place, i, j, size).not()) { check = 1 break } } } if (check == 1) { break } } if (check == 1) answer.add(0) else answer..
문제 풀이 언어 Kotlin 코드 class Solution { fun solution(record: Array): Array { val history = arrayListOf() val name = mutableMapOf() val result = arrayListOf() for (e in record.iterator()) { val act = e.split(" ") when (act[0]) { "Enter" -> { name[act[1]] = act[2] history.add(Pair(act[0], act[1])) } "Leave" -> { history.add(Pair(act[0], act[1])) } "Change" -> { name[act[1]] = act[2] } } } history.map ..
우선 간만에 알고리즘 문제를 접했던 터라 많이 어려웠다. FE / APP 개발 직군을 선택했고 총 4문제가 나왔는데 DP 1, 구현 1, 그래프 2 이렇게 나왔다. 사정이 있어서 30분 정도 뒤늦게 참석했고 2시간 동안 2번 하나만 풀었다. 시간이 더 있었어도 다른 문제를 풀지 못했을 것이다. 안드로이드 공부 때문에 알고리즘을 소홀히 했는데 앞으로는 편식하지 말고 알고리즘도 꾸준히 풀어야겠다. 문제 문제 저작권에 의해서 캡쳐는 하지 못했고 간단하게 설명하자면 주어진 배열을 재정렬하는 문제였다. 시계 방향, 반시계 방향으로 총 2가지의 방향이 있었으며 배열의 크기는 홀수와 짝수가 존재했다. 결과적으로 총 4가지 경우 대해 배열을 재정렬하는 문제였다. 풀이 언어 Kotlin 코드 class Solution ..
풀이 언어 Kotlin 코드 fun solution(s: String): Int { var minLength = s.length for (i in 0 until s.length / 2) { var subString = s.slice(0..i) var answer = "" var cnt = 1 var last = 0 for (j in i + 1 until s.length - i step i + 1) { // 마지막 Index 를 저장한다. last = j + i + 1 // 같은 SubString 인 경우 이를 카운트한다. if (subString == s.slice(j..j + i)) cnt += 1 // 다른 SubString 인 경우 else { if (cnt > 1) { // 숫자 + SubStri..
문제 하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다. 3 : 3 (한 가지) 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지) 53 : 5+7+11+13+17 = 53 (두 가지) 하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한 소수는 반드시 한 번만 덧셈에 사용될 수 있기 때문에, 3+5+5+7과 같은 표현도 적합하지 않다. 자연수가 주어졌을 때, 이 자연수를 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 자연수 N이 주어진다...
문제 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. 출력 첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다. 해결 방법 앞선 2문제와 다르게 정렬을 할 필요가 없는 문제이다. 주어진 배열 자체에서의 가장 작은 길이의 부분 합을 찾아야하기 때문이다. 알고리즘은 아래와 같다. 1. le..
문제 KOI 부설 과학연구소에서는 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. 각 용액에는 그 용액의 특성을 나타내는 하나의 정수가 주어져있다. 산성 용액의 특성값은 1부터 1,000,000,000까지의 양의 정수로 나타내고, 알칼리성 용액의 특성값은 -1부터 -1,000,000,000까지의 음의 정수로 나타낸다. 같은 양의 두 용액을 혼합한 용액의 특성값은 혼합에 사용된 각 용액의 특성값의 합으로 정의한다. 이 연구소에서는 같은 양의 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 한다. 예를 들어, 주어진 용액들의 특성값이 [-2, 4, -99, -1, 98]인 경우에는 특성값이 -99인 용액과 특성값이 98인 용액을 혼합하면 특성값이 -1인 용액을 만들 수 있고, 이 용액..
문제 n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000) 출력 문제의 조건을 만족하는 쌍의 개수를 출력한다. 해결방법 문제를 처음 접했을 때는 코틀린의 find를 사용해서 문제를 해결했다. 우선 입력 받은 배열을 오름차순으로 정렬하고, 맨 앞부터 탐색을 진행하면서 입력받은 x - ..