목록알고리즘 (18)
코드 한 줄
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 정수 배열이 주어지면 두 번째로 큰 값을 출력하라 예제 } Input : [10, 5, 4, 3, -1] Output : 5 Input : [3, 3, 3] Output : Does not exist. 이 문제는 가장 큰 값을 구하는 로직과 거의 똑같다. 가장 큰 값과 두 번째 큰 값을 저장할 변수를 만들고 배열 원소들과 비교하면 된다. 중요한 엣지 케이스는 배열이 0 이나 1개의 원소를 가지고 있으면 두번째 큰 값이 존재 하지 않는 것과 [3, 3, 3] 같은 경우처럼 두 번째로 큰 값은 존재 하지 않는다. 이를 계산하기 위해 두 번째 큰 값을 저장할 변수를 Integer.MIN_VALUE로 두고 for루프가 끝난 뒤 값이 변했는지 체크하면 된다..
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 주어진 String에 모든 단어들을 거꾸로 출력하라. 예제 } Input : "abc 123 apple" Output : "cba 321 elppa" 이 문제는 긴 String 을 각 단어로 나눈 다음, 각 단어를 거꾸로 하고, 모든 단어들을 합치면 풀 수 있다. public String reverseString(String s) { String words[] = split(s); StringBuilder res = new StringBuilder(); for (String word: words) res.append(reverse(word) + " "); return res.toString().trim(); } public String[] spli..
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 간격(interval)으로 이루어진 배열이 주어지면, 겹치는 간격 원소들을 합친 새로운 배열을 만들어라. 간격은 시작과 끝으로 이루어져 있으며, 시작은 끝보다 작거나 같다. 예제 } Input : {{2, 4}, {1, 5}, {7, 9}} Output : {{1, 5}, {7, 9}} Input : {{3, 6}, {1, 3}, {2, 4}} Output : {{1, 6}} 문제의 어려운 점은 간격 원소들이 무작위로 순서가 돼있는 것이다. 주로 이런 경우엔 자료구조를 써서 무작위 원소들을 쉽게 정리하거나, 원소들을 정렬하면 된다. 이 문제에선 간격 원소들을 정렬해보겠다. 간격 원소가 {start, end}로 나누어 있다고 가정하고, start로 ..
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 정수 배열과 타겟값이 주어지면, 합이 타겟값이 되는 두 원소의 인덱스를 찾아라. 예제 } Input : [2, 5, 6, 1, 10], 타겟값 : 8 Output : [0, 2] // 배열[0] + 배열[2] = 8 이 문제는 해쉬맵을 사용하여 원소 값과 원소 인덱스를 저장하면 쉽게 풀 수 있다. 각 배열의 원소마다 (타겟 - 원소 값)이 해쉬맵에 있는지 확인하면 된다. int[] solution(int[] input, int target) { Map map = new HashMap(); for(int i=0; i
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 먼저, 팰린드롬(palinedrome)이란 앞에서부터 읽으나 뒤에서부터 읽으나 똑같은 단어를 말한다. 정수 n에 대하여 팰린드롬인지 알아내는 방법을 구현하면 되고, 정수를 문자열로 변경해서는 안된다. 예제} Input : 12345 Output : False Input : -101 Output : False Input : 11111 Output : True Input : 12421 Output : True 일단 엣지 케이스를 살펴보자. 정수가 마이너스면 팰린드롬이 될 수 없다. 그리고 0이 아닌 정수가 0으로 끝난다면 이 경우 역시 팰린드롬이 될 수 없다. 주어진 숫자를 전반부와 후반부로 나눈다. 예를 들어 1233210이 주어지면, 123이 전반..
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 정수 n이 주어지면, n개의 여는 괄호 "("와 n개의 닫는 괄호 ")"로 만들 수 있는 괄호 조합을 모두 구하라. 예제} Input : 1 Output : ["()"] Input : 2 Output : ["(())", "()()"] Input : 3 Output : ["((()))", "(())()", "()(())", "()()()"] 주로 조합을 구하거나 답의 양이 많을 경우는 재귀함수를 사용하면 된다. empty string 부터 시작하여 "("를 더하고 재귀함수를 부르고, ")"를 더하고 재귀함수를 부르면 된다. 여기서 중요한 건, 현재 몇 개의 여는 괄호를 사용 하였는지와 몇 개의 닫는 괄호를 사용 하였는지 알아야 한다. 괄호 조합을 왼..
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 우선 피보나치란, 0과 1로 시작하며 다음 피보나치 수는 바로 앞의 두 피보나치 수의 합이 된다. 이때, 주어지는 정수 n보다 작은 피보나치 수 중 모든 짝수의 합을 구하라. 예제} Input : n = 12 Output : 10 // 0, 1, 2, 3, 5, 8 중 짝수인 2 + 8 = 10 이 문제는 n보다 클 때까지 피보나치의 수를 구하며 짝수인 피보나치 수를 다 더해주면 된다. int evenFibSum(int N) { int sum = 0; int x = 1; int y = 2; while (x
* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다. 정수 배열(int array)가 주어지면 가장 큰 이어지는 원소들의 합을 구하시오. 단, 시간복잡도는 O(n). 예제} Input : [-1, 3, -1, 5] Output : 7 // 3 + (-1) + 5 Input : [-5, -3, -1] Output : -1 // -1 Input : [2, 4, -2, -3, 8] Output : 9 // 2 + 4 + (-2) + (-3) + 8 이 문제는 두 개의 정수 변수로 현재의 합(currentSum)과 전체의 제일 큰 합(maxSum)을 저장해야 합니다. 각 원소마다 (currentSum + 원소) 값을 원소 값이랑 비교하고, 더 큰 값이 currentSum이 됩니다. maxSum은 curren..