재귀 함수 문제입니다.
핵심
최댓값과 최솟값을 출력해야 하는데, 여러 가지 방법이 있겠지만 List를 사용하면 쉽게 출력할 수 있다.
정답 코드
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static int n;
static char[] arr;
static boolean[] check;
static int[] result;
static List list;
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
n =sc.nextInt();
arr = new char[n];
for (int i=0;i<n;i++){
arr[i] = sc.next().charAt(0);
}
result = new int[n+1];
check = new boolean[10];
list = new ArrayList<>();
inequal(0);
System.out.println(list.get(list.size()-1));
System.out.println(list.get(0));
}
static void inequal(int index){
if (index == n+1){
StringBuilder sb = new StringBuilder();
for (int arr: result){
sb.append(arr);
}
list.add(sb.toString());
return;
}
for (int i=0;i<10;i++){
if (index==0||!check[i]&&compare(result[index-1],i,arr[index-1])){
check[i] = true;
result[index] = i;
inequal(index+1);
check[i] = false;
}
}
}
static boolean compare(int frist,int second,char function){
if (function=='<')return frist<second;
else if (function=='>')return frist>second;
return false;
}
}
해설
arr는 괄호를 넣을 배열이다. result는 말 그대로 가능한 수를 넣을 배열이다.
result가 n+1의 크기를 갖는 이유는 괄호보다 숫자가 항상 1개 더 많이 나오기 때문이다.
중복을 제거하기 위해 boolean타입의 check도 사용하였다.
중요한 점은 index가 0일 때는 비교할 숫자가 없으므로 그냥 대입하게 된다.
이후부터는 compare 메서드를 이용하여 값을 비교한다.
가능한 모든 값들을 list에 담는다.
최댓값과 최솟값을 구하고 싶으므로 list의 마지막 값과 첫 번째 값을 출력한다.
배운 점
처음 풀 때는 최댓값과 최솟값을 출력을 어떻게 할지 많은 고민을 했었다.
List를 이용하여 값을 저장하면, 쉽게 해결할 수 있다는 것을 알았다.
메서드를 분리하여 사용하면서 코드를 더욱 간결하고 이해하기 쉽게 만들 수 있다는 것 다시 한번 깨달았다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 여행경로(java) (0) | 2022.12.20 |
---|---|
[프로그래머스] 명예의 전당(1) (java) (2) | 2022.11.25 |
[프로그래머스]2018 카카오 블라인드 공채, [1차]비밀지도(java) (0) | 2022.10.14 |
[프로그래머스]문자열 내 마음대로 정렬하기(java) (0) | 2022.10.13 |
[백준] 2204번 도비의 난독증 테스트(java) (0) | 2022.10.12 |