
프로그래머스에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.

요즘의 문제점 :
간단한걸 너무 복잡하게 풀고 싶어하는 경향이 있음. 리뷰하면서 반성합니다.
세 개의 구분자
임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.
예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.
문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.
문제 해설
ABC를 하나의 문자열로 replace하면 좋다. 그것으로 split처리한다.
나의 경우에는 빈값에 대한 처리를 어떻게 할까 고민하다가 removeAll을 사용했다.
정답
import java.util.*;
class Solution {
public String[] solution(String myStr) {
String[] answer = {};
myStr = myStr.replace("b", "a").replace("c","a");
answer = myStr.split("a");
ArrayList <String> list = new ArrayList<>(Arrays.asList(answer));
list.removeAll(Arrays.asList("",null));
if(list.isEmpty())
{ return new String[] {"EMPTY"}; }
return list.toArray(new String[0]);
}
}
stream을 제외하곤 다음과 같은 형태가 가능하다.
import java.util.Arrays;
class Solution {
public String[] solution(String myStr) {
myStr = myStr.replaceAll("[a|b|c]+", ",");
myStr = myStr.charAt(0) == ',' ? myStr.substring(1) : myStr;
myStr = myStr.equals("") ? "EMPTY" : myStr;
return myStr.split("[,]");
}
}
abc를 정규식으로 ,로 바꾼다. charAt(0)이 , 라면 1부터 자른다.
eqauls가 ""라면 Empty를 보낸다.
그리고 [,]라는 정규식으로 자른다.
연산 속도는 내쪽이 더 좋다. 코드의 간결함은 후자.
배열의 원소만큼 추가하기
아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 양의 정수 배열 arr가 매개변수로 주어질 때, arr의 앞에서부터 차례대로 원소를 보면서 원소가 a라면 X의 맨 뒤에 a를 a번 추가하는 일을 반복한 뒤의 배열 X를 return 하는 solution 함수를 작성해 주세요.
문제 해설
ArrayList 사용을 추천한다. 그렇게 해서 add형태로 arr[i] 개수만큼 추가하면 된다. 그리고 answer로 순환하며 넣기.
정답
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
int[] answer = {};
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i]; j++) {
list.add(arr[i]);
}
}
answer = new int[list.size()];
for (int i= 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
모범 정답과 비슷하다(좋아요가 가장 많은 정답은 여러 문제로 패스했다)
빈 배열에 추가, 삭제하기
아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때, flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.
문제 해설
ArrayList로 작업하면 편하다. flag[i]일때 arr[i] * 2를 ArrayList에 추가. false라면 remove해서 ArrayList.size() - 1을 제거한다.
정답
import java.util.*;
class Solution {
public int[] solution(int[] arr, boolean[] flag) {
int[] answer = {};
ArrayList<Integer> X = new ArrayList<>();
for(int i = 0; i < flag.length; i++) {
if(flag[i]) {
for(int j = 0; j < arr[i] * 2; j++) {
X.add(arr[i]);
}
}
else {
for(int j = 0; j < arr[i]; j++) {
X.remove(X.size() - 1);
}
}
}
answer = new int[X.size()];
for(int i = 0; i < answer.length; i++) {
answer[i] = X.get(i);
}
return answer;
}
}
모범 정답과 일치한다.
배열 만들기 6
0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만드려고 합니다.
i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.
만약 stk이 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고 i에 1을 더합니다.
stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.
위 작업을 마친 후 만들어진 stk을 return 하는 solution 함수를 완성해 주세요.
단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.
문제 해설
처음으로 나온 스택문제…
기어코 외면하고 있던 스택을 마주해야할 시간이 왔다.
Stack에 대해서는 inpa님의 좋은 설명이 있으니 참고.
🧱 자바 Stack 구조 & 사용법 정리
Stack 컬렉션 스택(Stack)의 사전적 정의는 '쌓다', '더미' 로서 접시 스택처럼 접시를 쌓아놓은 것을 말한다. 즉, 상자에 물건을 쌓아 올리듯이 데이터를 쌓는 자료 구조라고 할 수 있다. 아래 그림
inpa.tistory.com
stack을 사용해서 peek과 pop, push를 사용하면 간단해진다.
정답
import java.util.Stack;
class Solution {
public int[] solution(int[] arr) {
int[] answer = {};
Stack<Integer> stk = new Stack<>();
for(int i = 0; i < arr.length; i++) {
if(stk.isEmpty()) {
stk.push(arr[i]);
} else {
if(stk.peek().equals(arr[i])) {
stk.pop();
} else {
stk.push(arr[i]);
}
}
}
if(stk.isEmpty()) return new int[] {-1};
answer = new int[stk.size()];
for(int i = 0; i < answer.length; i++) {
answer[i] = stk.get(i);
}
return answer;
}
}
모범정답과 일치한다.
무작위로 K개의 수 뽑기
랜덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.
이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 k의 배열을 예상해봅시다.
정수 배열 arr가 주어집니다. 문제에서의 무작위의 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.
단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.
문제 해설
겹치지 않게 하기 위해서 LinkedHashSet을 사용했다. LinkedHashSet의 특징인 중복 불가를 이용했다.
정답
import java.util.*;
class Solution {
public int[] solution(int[] arr, int k) {
Set<Integer> set = new LinkedHashSet<>();
for (int num : arr) {
if (set.size() < k) {
set.add(num);
}
}
int[] answer = {};
answer = new int[k];
for(int i = 0; i < k; i++) {
answer[i] = -1;
}
int idx = 0;
for(int num : set) {
answer[idx++] = num;
}
return answer;
}
}
좋은 정답이 있어 가져온다.
import java.util.*;
class Solution {
public int[] solution(int[] arr, int k) {
ArrayList<Integer> arrayList = new ArrayList<>();
for (int a : arr)
if (!arrayList.contains(a))
arrayList.add(a);
int idx = 0;
int[] answer = new int[k];
for (int i = 0;i < k;i++)
answer[i] = -1;
for (int i = 0;i < k && i < arrayList.size();i++)
answer[i] = arrayList.get(i);
return answer;
}
}
contains로 체크하고 add한다. ArrayList에 contains를 사용할 수 있는지 몰랐다. 알면 아마 ArrayList를 썼을듯도.
'코테런 > 코딩 기초 트레이닝(완주)' 카테고리의 다른 글
| [코딩 테스트 RUN] 코딩 기초 트레이닝 21일차: 함수(메서드) (0) | 2026.02.26 |
|---|---|
| [코딩 테스트 RUN] 코딩 기초 트레이닝 20일차: 함수(메서드) (0) | 2026.02.25 |
| [코딩 테스트 RUN] 코딩 기초 트레이닝 18일차: 문자열 (0) | 2026.02.23 |
| [코딩 테스트 RUN] 코딩 기초 트레이닝 17일차: 문자열 (0) | 2026.02.22 |
| [코딩 테스트 RUN] 코딩 기초 트레이닝 16일차: 문자열 (0) | 2026.02.21 |