recursion 9

[JAVA]BOJ 9934, 완전 이진 트리

inoder로 들어온 완전이진트리를 트리의 모습.. 음 레벨 순회로 각 레벨마다 줄바꿈해서 출력하면 된다.import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import java.util.StringTokenizer;public class BOJ9934 { public static void getTree(int[] arr, int start, int end, int level, List> levels){ int middle; if(start > levels = new ArrayLi..

코딩가딩가 2024.09.22

[JAVA]BOJ 15657, N과 M (8)

중복가능, 비내림차순 = 오름차순 --> 중복 조합이다. 1. 메인 --> 입력받고 오름차순 정렬함2. printSequence 함수public static void printSequence(int[] arr, int[] result, int N, int M, int toPick){ int i, lastIdx, smallest; // base case -> 다 뽑았을때 if (toPick == 0){ for(i=0;ilastIdx : 결과 배열(result)의 인덱스 번호smallest : 오름차순 정렬을 위해 사용한다. 단, 중복선택이 가능해야 하므로 최솟값을 마지막에 선택한 값 그 자체로 설정한다. 예를 들면, 마지막으로 저장한 수가 'result[0] = 1'이면, 다음..

코딩가딩가 2024.09.06

[JAVA]BOJ 15656, N과 M (7)

오름차순이어야 한다는 조건이 없으니 이건 중복 순열 문제이다. 그냥 순열(백준 15654번)과 비슷한데, 중복체크하는 것만 빼면 된다. 1. 메인 --> 입력받고 오름차순 정렬함2. printSequence 함수public static void printSequence(int[] arr, int[] result, int N, int M, int toPick, StringBuilder sb){ int i, lastIdx; // base case -> 다 뽑았을때 if (toPick == 0){ for(i=0;ilastIdx : 결과 배열(result)의 인덱스 번호오름차순 정렬이 필요하지 않으니 smallest는 정의하지 않았다.(i는 0부터 시작..)base case는 앞선 ..

코딩가딩가 2024.09.06

[JAVA]BOJ 15655, N과 M (6)

이 문제는 조합이다. 조합은 순서에 상관없이 N개에서 M개를 선택하는 수열이다. 1 7과 7 1은 같은 수열이다. 1. 메인 --> 입력받고 오름차순 정렬함2. printSequence 함수public static void printSequence(int[] arr, int[] result, int N, int M, int toPick){ int i, lastIdx, smallest; // base case -> 다 뽑았을때 if (toPick == 0){ for(i=0;ilastIdx : 결과 배열(result)의 인덱스 번호smallest : 오름차순 정렬을 위해 사용하는데, 지금까지 선택한 수들보다 큰 수들중에 제일 작은 값을 저장한다. 예를 들면 마지막으로 저장한 수가..

코딩가딩가 2024.09.06

[JAVA]BOJ 15654, N과 M (5)

N에서 중복이 되지않게 M개를 고른다. 그리고 예제를 보니 1 7 과 7 1 은 다른 수열로 친다.. 즉 순서 따진다는거고 이는 '순열'을 뜻한다. 순열 문제이다. 순열은 순서를 고려하고 중복을 허용하지 않는 수열이다. 문제를 더 설명할건 없어서 바로 코드 설명으로 넘어가자.. 재귀를 사용했다. 1. 메인public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N, M, i; int[] arr, result; StringTokenizer st; st = new StringTokenizer(b..

코딩가딩가 2024.09.06

[JAVA]BOJ 1654, 랜선 자르기

앞서 한 나무자르기와 비슷한 문제이다. 이진탐색을 이용했고 나무자르기처럼 답이 딱 안 떨어질 때가 있다. 여유있게 잘라줘야한다.(예: 1 3 / 4 인 경우.. 원하는 답은 3 -> 2로 자르면 2개나오고 1로 자르면 4가 나옴, 답은 1) 1. 입력 받고 정렬2. 이진탐색을 이용해 특정값으로 잘라서 몇 개 나오는지 확인하기3. 출력 1. 3. 은 생략 2. 이진탐색을 이용해 특정값으로 잘라서 몇 개 나오는지 확인하기 처음 이진탐색 범위는 1~제일 긴 랜선 길이(Lan[K-1])이다. 1개 이상은 나와야 몇개가 나오는지 셀 수 있기 때문이다.. 문제에서 준 예제는 4 11 / 802 743 457 539 이고, 제일 긴 랜선은 802이므로 1 ~ 802로 이진탐색을 한다. 이진탐색의 조건은 mid로 잘랐..

코딩가딩가 2024.08.01

[JAVA]BOJ 2805, 나무 자르기

심하게 삽질 한 문제!!! 난 바보다... 이진탐색을 한다. 문제에 있는 예시처럼 10 15 17 20 배열이 있다면, 0 ~ 20으로 이진탐색을 한다. 처음에는 mid가 10이 됐다가.. 값 크기 차이를 보고 앞부분을 탐색하거나 뒷부분을 탐색한다. 이진탐색 쓰기로 정했을때 그 생각을 못하고 배열자체를 이진탐색해서 정확하게 찾은 경우, 못찾은경우에 mid들을 비교해서 1개씩 비교하고.. 어쩌고.. ㅎ.. 심지어 제일 처음에 풀때는 브루트포스로 풀었고 다른 예시는 다 적용이 되나 나무 크기가 중복되는 경우(10 10 10  1. 입력받고 정렬 -> 이진탐색 해야되니까..2. 이진탐색으로 적절한 값 찾기3. 출력하기 1. 3. 은 생략.. 2.만 추가설명 2. 이진탐색으로 적절한 값 찾기위에서 말한대로 0부..

코딩가딩가 2024.08.01

[JAVA]BOJ 11005, 진법 변환 2

어디서 많이 해본 진법변환 문제.. 보통 2진수, 8진수, 16진수로만 바꿨는데 36진법으로도 바꿔보았다. 사실 방법은 같으니까... 1. 진법 배열을 미리 만들고 2. 값을 입력받은 후 나누기 계산을 통해 진법 출력한다. 이때 재귀를 이용한다. 나는 재귀가 좋아.. 1. 진법 배열 미리 만들기 0   1   2   3  ...   Y     Z  [0] [1] [2] [3] ... [34] [35]이런식으로 미리 저장해둔다. for문을 쓸까 하다가 ..알파벳부터는 또 새로 만들어야 하니까 귀찮아서 아예 초기값으로 줘버렸다.예를들어 8진법이면 0~7 까지만 사용할거고 실제 출력값은 Bformation[0] ~ [7]이 될거다. ('0' ~ '7')이렇게 한 이유는 알파벳 때문이다. 숫자 0~9가 아닌 문..

코딩가딩가 2024.07.13

[JAVA]BOJ 10448, 유레카 이론

Brute Force 방식으로 풀어야 한다. 사실 이게 브루트 포스 방식인지 몰랐는데.. 내가 학교에서 푼 코딩은 대부분 브루트 포스였구나 하고 깨달았다. 아무튼~ T : 변수 K를 입력받는 횟수K : 3개의 삼각수인지 확인할 변수Tn[ ] : Tn을 미리 구해서 저장해놓은 배열 생각한 방식은.. 1. Tn을 미리 구해놓는다. 2. 재귀를 이용해 K - Tn을 한다. 3. K - Tn을 할 때마다 횟수를 더해준다. 간단히 요약하면 이렇게 된다. 다른 쉬운 풀이방법도 많은데 재귀가 더 익숙해서 재귀로.. 1. Tn을 미리 배열에 저장해둔다Tn = n * (n + 1) / 2 이므로 그냥 계산해서 미리 배열에 저장하면 된다. 그럼 몇번째 Tn까지 저장하면 될까..? 문제에서 K는 1000이하라고 했으므로 '..

코딩가딩가 2024.07.13