목차 분할 정복 단계 [Java+Python]1992번, 쿼드 트리 [Java+Python]1780번, 종이의 개수 [Java+Python]1629번, 곱셈 [Java+Python]11401번, 이항 계수 3 [Java+Python]2740번, 행렬 곱셈 [Java+Python]10830번, 행렬 제곱 [Java+Python]11444번, 피보나치 수 6 [Java+Python]6549번, 히스토그램에서 가장 큰 직사각형 문제 아래 과 같이 여러 개의 정사각형칸들로 이루어진 정사각형 모양의 종이가 주어져 있고, 각 정사각형들은 하얀색으로 칠해져 있거나 파란색으로 칠해져 있다. 주어진 종이를 일정한 규칙에 따라 잘라서 다양한 크기를 가진 정사각형 모양의 하얀색 또는 파란색 색종이를 만들려고 한다. 전체 종..
목차 Divide and Conquer 분할 정복 알고리즘은 큰 문제를 작은 문제로 나누어(분할) 해결(정복)하는 알고리즘이다. 조금 더 구체적으로 적자면 분할(Divide): 복잡한 문제를 더 작고 관리하기 쉬운 부분 문제로 분해하여 정복(Conquer): 이 부분 문제들을 해결한 후 결합(Combine): 이들의 해결 결과를 결합하여 원래 문제의 해답을 찾는다. 예를 들자면 정렬 알고리즘 중 병합정렬과 퀵 정렬이 이에 해당하는데, 각 구현방식은 아래 글에 설명되어 있다. [Java+Python]병합 정렬(Merge Sort) [Java+Python]병합 정렬(Merge Sort) 으로 구현한 다른 정렬: [Java+Python]삽입 정렬(Insert Sort) [Java+Python]버블 정렬(Bub..
문제 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27,...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다. *** * * *** N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3) ×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다. 입력 첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 $N=3^{k}$이며, 이때 1 ≤ k < 8이다. 출력 첫째 줄부터 N번째 줄까지 별을 출력한다. 풀이 오랜 시간이 걸려서 풀었지만 풀어놓고도 잘 이해가 가지 않는 문제이..
문제 정휘는 후배들이 재귀 함수를 잘 다루는 재귀의 귀재인지 알아보기 위해 재귀 함수와 관련된 문제를 출제하기로 했다. 팰린드롬이란, 앞에서부터 읽었을 때와 뒤에서부터 읽었을 때가 같은 문자열을 말한다. 팰린드롬의 예시로 AAA, ABBA, ABABA 등이 있고, 팰린드롬이 아닌 문자열의 예시로 ABCA, PALINDROME 등이 있다. 어떤 문자열이 팰린드롬인지 판별하는 문제는 재귀 함수를 이용해 쉽게 해결할 수 있다. 아래 코드의 isPalindrome 함수는 주어진 문자열이 팰린드롬이면 1, 팰린드롬이 아니면 0을 반환하는 함수다. #include #include int recursion(const char *s, int l, int r){ if(l >= r) return 1; else if(s[l..
팩토리얼은 간단하게 n!로 나타내며, 1부터 n까지의 모든 자연수를 1씩 더해가며 곱하는 연산을 가리킨다. 개념을 더 정확하게 파악하려면 1부터 n까지의 자연수가 아닌 n부터 1까지의 자연수를 곱하는 게 맞지만, 지금은 그게 중요한게 아니니까. 파이썬으로는 크게 세 가지 방법으로 팩토리얼을 구현할 수 있다. 물론 바텀업 방식의 동적계획법 등은 여기에선 빠져있다. 가장 먼저, 파이썬의 math 라이브러리에서 제공하는 기본 함수를 사용하자. 그냥 가져다 쓰면 된다. import sys import math n = int(sys.stdin.readline().rstrip()) print(math.factorial(n)) sys 라이브러리를 사용하지 않으면 세 줄로 팩토리얼 계산이 끝나버린다. 다음 방법은 재귀..
문제 평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다. 이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1) 층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다. 아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. 입력 첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에..
문제 평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다. 이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1) 층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다. 아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. 입력 첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에..
모든 반복문은 언제나 재귀 함수로 변환할 수 있으며, 그 반대도 마찬가지다. 따라서 개발자의 필요에 따라 적절히 골라서 사용하는 것이 중요한데, 그 장단점과 차이를 정리해보자. 반복문(Iteration) 선언 - 이 곳에서 반복이 일어난다는 것을 명시. 직관적이며 가독성 좋음. 시작 - 초기화, 반복 조건, 제어 변수의 변경, 반복문 내의 명령문 실행에 대한 정보 명시 종료 - 특정 조건에 도달 할 때까지 반복적으로 실행 무한반복 - 반복 조건에 따라 발생하며 CPU 사이클을 반복적으로 사용 메모리 - 힙 메모리 사용(넘칠 시 Out Of Memory 에러 발생) 속도 - 빠름 변수 - 많음. 이는 변경 가능한 상태의 증가로 이어지며 프로그램 오류가 발생할 가능성이 상대적으로 높음. 재귀 함수(Recur..
재귀란 일반적으로 정의하자면 자기 언급이다. 수학으로 봤을 땐 일종의 점화식이라고 할 수 있으며, 프로그래밍적으로 이야기하자면 재귀 함수란 정의 단계에서 자시 자신을 호출하는 함수를 가리킨다. 주어진 문제를 풀 때 자기 자신을 다시 호출함으로써 코드의 복잡도를 줄이기 위해 사용한다. 하지만 꼬리재귀 최적화가 되어있지 않은 환경에서 재귀 호출은 스택 메모리를 빠르게 잡아먹게 되므로 실행 속도 측면에서 반복문이 더 좋은 선택이 된다. 여기서 꼬리재귀 최적화란 메서드를 재귀 호출 메서드와 꼬리 메서드로 구분해 재귀 호출 이후 추가적인 연산을 실행하지 않도록 막는 방법이며, C++, Swift, Kotlin 컴파일러에는 자동으로 구현되어 있으나 보안상의 이유로 자바 컴파일러엔 구현되지 않았다. 다만 이에 영향을..
지난 번 글에서 재귀함수의 정의와 구현방법에 대해 알아보았다. https://gnidinger-coding.tistory.com/37 [Java]재귀 함수(Recursive Functions) 출처: https://www.geeksforgeeks.org/recursive-functions/ Recursive Functions - GeeksforGeeks A Computer Science portal for geeks. It contains well written, well thought and well explained computer.. gnidinger-coding.tistory.com 이 글을 바탕으로 이번 글에선 여러가지 적용 예를 들어본다. sayHello 이름 그대로 문자열 "Hello"를 n..
- Total
- Today
- Yesterday
- 알고리즘
- spring
- 유럽
- 중남미
- java
- 남미
- 스프링
- 동적계획법
- 면접 준비
- a6000
- 칼이사
- 기술면접
- 세계일주
- 맛집
- Python
- 스트림
- 세모
- 파이썬
- BOJ
- 자바
- RX100M5
- Algorithm
- 리스트
- 세계여행
- 지지
- Backjoon
- 야경
- 유럽여행
- 여행
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |