목록코딩테스트 풀이 (28)
Simple&Natural
풀이과정) 문제에 풀이과정을 친절히 다 써놔서 그냥 순서대로 따라가며 코드로 구현만 하면 되는 문제였다. 재귀함수에 대한 개념을 알아야 풀 수 있는 문제이다. 일단 문제의 포인트를 짚어보자면 1. 균형잡힌 괄호 문자열 2. 올바른 괄호 문자열 이 두 가지를 판단하는 로직을 짤 수 있는가이다. 1번의 경우, "(" 와 ")" 의 갯수를 비교해주면서 두 괄호 요소의 갯수가 최초로 같아지는 시점을 골라내면 된다. 2번의 경우, 괄호 요소는 반드시 "(" 로 시작해야 하며 중간에 나오는 요소들은 한 번이라도 ")" 가 많아지면 안된다. "(" 를 +1로, ")"를 -1로 가정하고 합계가 0보다 작아지는 지점이 존재한다면 이는 올바른 괄호 문자열이 아님을 의미한다. 사용 언어 : Kotlin 풀이) 1 2 3 4..
풀이과정) 처음에는 0.001초씩 1초 범위의 스코프를 움직이며 로그검색을 해보았는데 이렇게 되면 지나치게 많은 연산이 필요하다. 예를 들어 8시간의 로그를 검색하기 위해 8*60*60*1000*n(로그갯수) 번의 연산을 하게 되는데 이러면 시간초과로 문제를 풀 수가 없다. 이렇게 문제를 간단하고 무식하게 풀도록 냈을리가 없는 게 당연하지만 혹시 모르니 그냥 시도해보았다. (당연히 실패) 이후 다른 풀이를 생각하던 도중 로그의 시작과 끝을 분석하면 되겠다는 포인트를 발견. 이유인 즉슨, 한 시점에서의 로그의 갯수가 변하는 경우는 새로운 로그가 시작되거나 기존의 로그가 끝나는 순간이기 때문이다. 우선 lines의 모든 로그들을 파싱하여 logArr이라는 배열에 담아두었다. 첫 번째 요소인 startSec는..
풀이과정) 그냥 두 배열을 정렬한 다음 차례대로 비교하면서 일치하지 않는 부분을 골라내면 된다. 사용언어 : Javascript 풀이) 1 2 3 4 5 6 7 8 9 10 11 12 13 function solution(participant, completion) { var answer = ''; participant.sort(); completion.sort(); for(var prop in participant) if(participant[prop]!=completion[prop]) { answer = participant[prop]; break; } return answer; } Colored by Color Scripter cs 출처 : https://programmers.co.kr/learn/..
풀이과정) 일반적인 재귀를 이용하면 스택오버가 발생하므로 꼬리재귀 함수를 이용해야 한다. 사용언어 : Kotlin 풀이) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Solution { tailrec fun fibNum(n: Int, a: Int, b: Int): Int { if (n==1) return b else if (n==0) return a return if((a+b)/1234567>=1) fibNum(n-1, b, (a+b)%1234567) else fibNum(n-1, b, a+b) } fun solution(n: Int): Int { return fibNum(n, 0, 1) } } Colored by Color Scripter cs 출처 : https://progr..