반응형

Data Structure - Algorithm 27

Top-Down 방식의 재귀(recursion)를 Bottom-Up 방식의 반복문(iteration)으로 변환하기

재귀(recursion)를 반복문(iteration)으로 바꾸는 것은 “재귀를 수동으로 스택으로 구현”하거나, “재귀의 흐름을 반복문으로 흐르게 만드는 방식”입니다. 이 과정은 컴퓨터가 호출 스택을 활용해 함수를 호출하는 구조를 우리가 직접 명시적으로 처리하는 것으로 이해하면 됩니다. 목적재귀 → 반복문으로 변환하는 이유는 다음과 같습니다. • 스택 오버플로우 방지 • 성능 최적화 • 더 명시적이고 디버깅이 쉬운 코드 재귀 → 반복문 변환하기 1단계: 재귀 함수의 핵심 구조 파악 아래 예시 코드에 해당하는 1로 만들기 (Top-Down) 문제의 재귀구조 [백준 #1463] 1로 만들기https://www.acmicpc.net/problem/1463문제정수 X에 사용할 수 있는 연산은 다음과 같..

[백준 #1463] 1로 만들기

https://www.acmicpc.net/problem/1463문제정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.1. X가 3으로 나누어 떨어지면, 3으로 나눈다.2. X가 2로 나누어 떨어지면, 2로 나눈다.3. 1을 뺀다.정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력첫째 줄에 1보다 크거나 같고, 10^6보다 작거나 같은 정수 N이 주어진다. 출력첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 예제 입력 12 예제 출력 11 예제 입력 210 예제 출력 23 해결 코드import java.util.Scanner;public class Main { static int[] DP; public s..

[백준 #2751] 수 정렬하기 2

https://www.acmicpc.net/problem/2751 문제N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. 입력첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. 출력첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다. 예제 입력 1554321 예제 출력 112345 해결 코드import java.util.Scanner;import java.util.List;import java.util.ArrayList;import java.util.Comparator;public class Baekjoon2..

[백준 #9012] 괄호

https://www.acmicpc.net/problem/9012 문제괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 ..

[백준 #11650] 좌표 정렬하기

https://www.acmicpc.net/problem/11650 문제2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오. 입력첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 x_i와 y_i가 주어진다. (-100,000 ≤ x_,i y_i ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. 출력첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다. 예제 입력 153 41 11 -12 23 3 예제 출력 11 -11 12 23 33 4 해결 코드import java.util.Scanner;import java.util..

[백준 #10845] 큐

https://www.acmicpc.net/problem/10845 문제정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.명령은 총 여섯 가지이다.push X: 정수 X를 큐에 넣는 연산이다.pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.size: 큐에 들어있는 정수의 개수를 출력한다.empty: 큐가 비어있으면 1, 아니면 0을 출력한다.front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. 입력첫째 줄에 주어지는 명령의 수 ..

[백준 #2606] 바이러스

https://www.acmicpc.net/problem/2606 문제 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 ..

[백준 #4673] 셀프 넘버

https://www.acmicpc.net/problem/4673 문제셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.33, 39, 51, 57, 69, 84, 96, 111, 114, 120..

[백준 #1158] 요세푸스 문제

https://www.acmicpc.net/problem/1158 문제요세푸스 문제는 다음과 같다.1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 이다.N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오. 입력첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) 출력예제와 같이 요세푸스 순열을 출력한다. 예제 ..

[백준 #15649] N과 M (1)

https://www.acmicpc.net/problem/15649 문제자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 입력첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8) 출력한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.수열은 사전 순으로 증가하는 순서로 출력해야 한다.예제입력출력13 11 2324 21 2 1 31 42 12 32 43 13 23 44 14 24 334 41 2 3 4 1 2 4 31 3 2 41 3 4 21 4 2 31 4 3 22 1 3 42 1 4..

반응형