Computer_Language/Algorithm 31

[백준] 2252번 줄 세우기 파이썬 해설

출처 : https://www.acmicpc.net/problem/2252 입사 후 교육을 받는 기간이라 주말에 간간히 한 두 문제 정도 풀 수 있다..ㅜ 심지어 회사와 관련된 내용과 지식은 보안상 조심해야 한다고 하기 때문에 퇴사 전 까지는 알고리즘 문제 풀이 정도나 올릴 것 같다. 오늘은 동기들을 통해 추천받은 "위상 정렬" 알고리즘 문제를 풀어봤다. 정답률도 높고, 정답의 범위도 넓기 때문에 푸는데 조금 수월했던 것 같다. 풀이 위상정렬의 개념에 대해서 공부하기 좋은 기본 문제라고 생각한다. a, b를 입력받을 때 a가 b를 참조한다고 생각하고, 참조 횟수가 0인 정점부터 위상 정렬을 수행하면 쉽게 문제를 풀 수 있다. 다만 참조 횟수가 0인 정점에 대해 정렬을 수행하고 나서 해당 정점이 참조하던 ..

[백준] 4949번 균형잡힌 세상 파이썬 해설

출처 : https://www.acmicpc.net/problem/4949 입사 후 교육을 받는 기간이라 주말에 간간히 한 두 문제 정도 풀 수 있다..ㅜ 심지어 회사와 관련된 내용과 지식은 보안상 조심해야 한다고 하기 때문에 퇴사 전 까지는 알고리즘 문제 풀이 정도나 올릴 것 같다. 오늘은 오랜만에 알고리즘 문제를 풀었기 때문에 다소 쉬운 문제를 선택했다. 문자열을 다루는 문제이며 괄호 찾기와 매우 유사한 문제이기 때문에 자료구조 stack을 이용하면 쉽게 풀 수 있다. 풀이 문제를 정독하고 간단하게 알고리즘을 설계한 뒤 그대로 코드로 구현하였다. 1. 입력을 받는다. 2. 좌측 괄호('(', '[')인지 검사한다. 만약 좌측 괄호라면 스택에 넣어준다. 3. 우측 괄호인지(')', ']') 검사한다. ..

[백준] 1713번 후보 추천하기 파이썬 해설

출처 : https://www.acmicpc.net/problem/1713 코딩 테스트 문제에서 자주 출현하는 구현 알고리즘이다. 보통 1, 2번 문제에 출제되고 긴장하면 말리기 쉬운 문제 유형이니 많이 풀어서 익숙해지는 게 중요한 것 같다. 풀이 보통 구현 문제는 여러가지 조건을 그대로 구현하면 정답을 맞힐 수 있는 구조로 많이 출제된다. 성급하게 접근하기 보단 문제의 조건을 읽어보고 정리한 뒤에 알고리즘을 설계하는 것을 추천한다. 문제의 조건은 다음과 같다. 학생들이 추천을 시작하기 전에 모든 사진틀은 비어있다. 어떤 학생이 특정 학생을 추천하면, 추천받은 학생의 사진이 반드시 사진틀에 게시되어야 한다. 비어있는 사진틀이 없는 경우에는 현재까지 추천받은 횟수가 가장 적은 학생의 사진을 삭제하고, 그 ..

[백준] 7576번 토마토 파이썬 해설 (BFS)

출처 : https://www.acmicpc.net/problem/7576 BFS 알고리즘으로 분류된 문제이다. 코딩 테스트를 통과하기 위해 알고리즘 문제를 많이 풀던 시기에 가장 취약했던 알고리즘의 종류 중 하나이다. 한 번의 시도만에 취업을 성공해서 당분간 코딩 테스트는 치르지 않지만, 약점을 보완하기 위해 내가 약했던 알고리즘을 위주로 문제를 다시 풀어보고 있다. 풀이 처음 이 문제를 접근할 때는 하루가 지날 때 마다 배열의 모든 점을 탐색하는 알고리즘을 설계하고 그대로 구현하였다. 나름 예외처리를 했다고 생각했지만 M과 N이 증가 할 수록 시간 복잡도가 기하급수적으로 늘어났고 결국 시간 초과라는 결과를 받았다. ㅜㅜ 그 후에 파이썬의 dequeue 모듈을 사용해서 좀더 효율적인 알고리즘을 새로 설..

[백준] 1541번 잃어버린 괄호 Python 해설 (그리디 알고리즘)

출처 : https://www.acmicpc.net/problem/1541 1541번: 잃어버린 괄호 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. www.acmicpc.net 그리디 알고리즘으로 분류된 문제이다. 코딩 테스트나 알고리즘 경진대회에서 해당 알고리즘이 나온다면 확실하게 점수를 가져가야 한다!! 그리 어렵지 않은 알고리즘이니 쉽게 문제를 풀어보자 풀이 여기에 그리디 알고리즘에 대해서 언급한 적이 있다. 간단하게 가장 좋은 선택을 알고리즘이라고 생각한다. "잃어버린 괄호" 문제는 가장 최..

[백준] 2661번 좋은수열 Python 해설 (백트래킹 알고리즘)

출처 : https://www.acmicpc.net/problem/2661 2661번: 좋은수열 첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다. www.acmicpc.net 백트래킹 알고리즘으로 분류된 문제이다. 코딩 테스트를 몇 차례 보면서 탐색, 백트래킹 쪽 문제에 약하다는 걸 알고 관련 문제를 많이 풀어보려고 하는 중이다. 풀이 입력받은 자릿수만큼의 길이가 될 때까지 깊이 우선 탐색을 진행하게 된다. 깊이 우선 탐색만 예를 들면 n = 7일 경우 첫 결과는 1111111이 된다. (최솟값 우선 조건 적용) 하지만 백트래킹 알고리즘을 적용하여 깊이 우선 탐색에 조건을..

[백준] 1717번 집합의 표현 Python 해설

출처 : https://www.acmicpc.net/problem/1717 1717번: 집합의 표현 첫째 줄에 n(1≤n≤1,000,000), m(1≤m≤100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a www.acmicpc.net Disjoint-set 알고리즘으로 분류된 문제이다. N사에 떨어졌다고 생각하고 K사 채용연계형 인턴 정형의 코딩 테스트를 ..

[백준] 11003번 최솟값 찾기 Python 해설

출처 : https://www.acmicpc.net/problem/11003 11003번: 최솟값 찾기 N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다. www.acmicpc.net 슬라이딩 윈도우 알고리즘으로 분류된 문제이다. 열몇 번의 시도만에 풀었다.. 풀이 - Python 정답 코드 from collections import deque n, l = map(int, input().split()) arr = [*map(int, input().split())] m = deque() for i in range(n): tmp = arr[..

[백준] 10868번 최솟값 Python 해설

출처 : https://www.acmicpc.net/problem/10868 10868번: 최솟값 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는 어려운 문제가 된다. 이 문제를 해결해 보자. 여기서 a번째라는 것은 입력되는 순서로 a번째라는 이야기이다. 예를 들어 a=1, b=3이라면 입력된 순서대로 1번, 2번, 3번 정수 중에서 최솟값을 찾아야 한다. 각각의 정수들은 www.acmicpc.net 세그먼트 트리에 입문하기 위해 딱 좋은 문제라고 생각한다. 풀이 - Python 정답 코드 import sys from mat..

[백준] 4673번 셀프 넘버 C, Python 해설

에라토스테네스의 체 알고리즘으로 분류된 문제이다. 하지만 C언어로 푼 다면 단순하게 자신만의 알고리즘으로도 풀이가 가능하다. 풀이 문제에서 정의한 셀프 넘버는 생성자가 없는 숫자를 뜻한다. 문제에서 제공된 함수 d(n)을 구현하고, 1부터 10000까지 반복하여 생성자가 존재하는 숫자에 대해서는 미리 체크한 뒤 체크되지 않은 수만 출력하는 알고리즘으로 문제에 접근하였다. - C 정답 코드 #include int self_num(int num) { int sum = num; while (num != 0) { sum += num % 10; num /= 10; } return sum; } int main() { int i = 1, tmp; char arr[10001] = { 0, }; for (; i < 10..