프로그래머스
[프로그래머스,Level 2] 튜플 (JAVA 구현)
- 첫 풀이 및 정답풀이 이 문제는 튜플에 속하는 원소들이 주어져 그것을 바탕으로 튜플을 구하는 것인 문제이다. 입출력 예제 1번을 통해 살펴보면, [2, 1, 3, 4]라는 튜블이 있을 때 이 튜블에 속하는 원소는 가장 앞에 있는 숫자부터 차례대로 붙여나가면 된다. 즉, 첫 번째 원소는 가장 앞에 있는 {2}/ 두 번째 원소는 앞선 원소와 그다음 숫자인 {2,1}/ 세 번째 원소는 {2, 1, 3}/ 네 번째 원소는 {2, 1, 3, 4}가 된다. 단, 주의해야 할 점은 튜블 원소 내의 숫자들의 위치는 바뀔 수 있다는 점이다. 위의 세 번째 원소를 예로 들면, {1, 3, 2}도 튜플의 원소가 될 수 있다. 튜플의 원소들은 뒤로갈수록 길어지는 특징이 있기 때문에, 원소들의 길이를 기준으로 정렬한 뒤 가..
[프로그래머스,Level 2] 단체사진 찍기 (JAVA 구현)
- 첫 풀이 및 정답풀이 이 문제는 주어진 요소들(카카오프렌즈)을 조건에 맞게 배치할 수 있는지 확인하는 문제이다. 즉, 모든 경우의 수를 완전 탐색으로 순회하며 조건에 맞는 경우를 카운트해주면 된다. 모든 경우의 수를 탐색하는 경우는 재귀 메서드를 이용하면 구할 수 있고 주어진 조건 문자열을 파싱 하여 알맞게 작성해주면 된다. 단, 이 문제는 주의해야 할 점이 전역변수로 카운트했다면 solution 메서드 안에서 초기화를 해주어야 통과가 가능하다. 이유는 모르겠다. import java.util.HashMap; class Solution { // 1. 인덱스 방문 여부 체크 배열. static boolean check[] = new boolean[8]; // 2. 카카오 프렌즈 0~7인덱스까지 각 알파..
[프로그래머스,Level 2] 괄호 변환 (JAVA 구현)
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 2. 문자열 w를 두 "균형 잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형 잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 4-3. ')'를 다시 붙입니다. 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열..
[프로그래머스,Level 2] 메뉴 리뉴얼 (JAVA 구현)
- 첫 풀이 및 정답풀이 이 문제를 처음 읽고 좀 복잡하여 완벽히 이해할 수 없었다. 문제를 풀기 전에 문제를 이해해보기로 하였다. 우선 문제에서 주어지는 배열은 2가지이다. orders는 문자열 배열로 여러 명의 손님이 주문한 단품 메뉴 정보이다. 입출력 예제 3번의 경우 "XYZ", "XWY", "WXA"가 의미하는 것은 3명의 손님이 존재하며, 첫 번째 손님은 X, Y, Z라는 세 가지 단품 메뉴를, 두 번째 손님은 X, W, Y라는 세 가지 단품 메뉴, 세 번째 손님은 W, X, A라는 세 가지 단품 메뉴를 주문한 것이다. 다음 배열인 course는 코스요리를 구성하는 단품 메뉴의 개수를 의미한다. 입출력 예제 3번에서는 2, 3, 4가 주어졌다. 이는 각각 코스요리에 포함되는 단품 메뉴의 개수가..
[프로그래머스,Level 2] N개의 최소공배수 (JAVA 구현)
- 첫 풀이 및 정답풀이 이 문제를 접하자마자 최소공배수, 최대공약수가 나오는 문제는 유클리드 호제법 알고리즘을 이용해야 한다는 사실을 알고 있었기 때문에 접근 자체는 쉬울 것이라 생각했다. 그러나, 앞서 level 1인 최소공배수, 최대공약수 문제에서는 2개의 자연수에 대해서만 적용해 보았기 때문에 N 개는 어떻게 접근해야 할지 몰랐다. N개의 최소공배수뿐 아니라 최대공약수 역시 앞서 두 개의 자연수에 대해 해당 값들을 구한 뒤, 해당 값들과 다음 값의 최대공약수, 최소공배수를 구하면 N개에 대해 구할 수 있다는 사실을 알 수 있었다. 예제 입력1을 예로 들면, 처음 두 수인 2와 6에 대해서 유클리드 호제법 알고리즘을 이용해 최대공약수 2와 최소공배수 6을 구할 수 있다. 여기서 구한 최소공배수 6과..
[프로그래머스,Level 2] JadenCase 문자열 만들기 (JAVA 구현)
- 첫 풀이 및 정답풀이 이 문제를 접근하는 방식에 대해서는 제대로 접근하였지만, 고려하지 못한 부분으로 인해 시간이 좀 걸렸다. 우선 이 문제는 프로그래머스 level 1의 '이상한 문자 만들기' 문제와 유사하게 주어지는 문자열 내부에 공백이 존재하는 경우를 고려해 주어야 한다. 예를 들어 "_A__sdf_fFt_"라는 입력이 주어졌을 때, 출력해야 하는 결과는 "_A__Sdf_Fft_"가 된다. 즉, split() 메서드를 이용해 공백을 구분자로 하여 문자열들을 분리할 때, 공백을 무시하지 않도록 split() 메서드의 limit값을 -1로 주어야 한다. 이렇게 문자열을 분해하면, {_ , A, _, sdf, fFt, _}로 분해가 된다. 이 상태에서 각 요소를 참조했을 때, 공백이라면 공백만을 추가..
[프로그래머스,Level 2] 행렬의 곱셈 (JAVA 구현)
- 첫 풀이 및 정답풀이 고등학교인가 수학 시간에 배운 행렬의 곱셈에 대한 문제이다. 이에 대한 개념을 모르더라도 간단하게 검색을 통해 알 수 있을 정도로 쉬운 개념이므로 모르는 분들은 한 번 검색 후 풀어보는 것을 추천한다. 우선 이 문제의 정답을 담을 배열의 크기는 arr1의 행의 길이와 arr2의 열의 길이로 만들어 준다. 다음으로 예제 1번을 예로 들어보면, answer 배열의 0,0에 들어가는 값은 arr1(0,0) * arr2(0,0) + arr1(0,1) * arr2(1,0)이 된다. 여기서 알 수 있는 사실은 동일한 개수의 순서쌍을 arr1과 arr2가 갖는다는 사실이다. 여기서는 2개의 순서쌍이 존재한다. arr1의 0,0과 arr2의 0,0 그리고 arr1의 0,1과 arr2의 1,0...
[프로그래머스,Level 2] 피보나치 수 (JAVA 구현)
- 첫 풀이 및 정답풀이 재귀를 통해 간단하게 풀 수 있는 대표적인 문제인 피보나치 수를 구하는 문제이다. 단, 문제에서 피보나치 수를 1234567로 나눈 나머지를 원하며, n의 범위가 100000 이하 이므로 dp를 활용해 풀어야 한다. dp를 활용해 중복되는 계산과정을 반복하지 않고, 한 번만 계산을 수행해 해당 값을 저장해 둔 뒤 참조만 하는 형식으로 진행하면 된다. 과정은 아래와 같다. 1. 피보나치 수 0은 0, 1은 1이므로 재귀메소드로 들어온 값이 0이면 0, 1이면 1을 반환한다. 2. 2 부터는 초기의 dp 배열에 값이 존재하지 않으므로 dp [2] = ( fibonacci(n-1) + fibonacci(n-2) ) % 1234567;을 수행한다. 3. 3은 fibonacci(2)+fi..
[프로그래머스,Level 2] 최솟값 만들기 (JAVA 구현)
- 첫 풀이 및 정답풀이 이 문제에서 우선 잘못 출력된듯한 부분이 있는데, 문제 설명 부분의 예시에서 "A에서 첫번째 숫자인 1, B에서 두 번째 숫자인 5를 뽑아 곱하여 더합니다." 라고 나와있지만, 입출력 예를 보면 알 수 있듯이 B에서 5의 위치는 첫 번째이기 때문에 이를 혼동하면 안 된다. 처음 문제를 읽고 이해한 것은 예를 들어 A에서 0번째 인덱스를 선택했다면, B에서 0번째 인덱스를 선택하면 안 된다고 이해했지만, 예시를 설명하는 부분을 보면 A와 B 배열 모두 첫 번째 숫자를 선택했기 때문에 잘못 이해했다는 것을 깨달았다. 다시 잘 생각해보니, 한 번 선택한 숫자는 다시 사용할 수 없다는 소리였다. 문제에 대한 이해를 마치고, 어떻게 풀어볼까 고민하던 중 DFS를 활용해 완전 탐색을 수행하..
[프로그래머스,Level 2] 최댓값과 최솟값 (JAVA 구현)
- 첫 풀이 및 정답풀이 레벨 2의 문제라고 생각되지 않는 간단한 문제였다. 문자열로 주어지는 정수의 나열들 중 최댓값과 최솟값을 찾아 반환하면 되는 문제로, 정렬 후 0번 인덱스와 마지막 인덱스를 반환하면 되는 문제이다. 단, 문제는 정렬하는 방식에 있어서의 선택일 것이다. 필자는 Comparator인터페이스를 애용하므로 이를 활용해 정렬하였다. 처음에는 Comparator 인터페이스를 오버 라이딩하여, 문자열을 비교하는 메소드인 compareTo를 사용하는 방식을 시도했었는데, 음수의 경우 -와정 수로 구분되기 때문에 한 문자열에 양의 정수와 음의 정수가 함께 있는 문자열로 인해 실패하는 테스트 케이스가 존재했다. 따라서 그냥 비교하는 문자열들을 정수로 변환하여 Integer.compare() 메소드..