본문 바로가기

전체 글103

[백준] 2661번 : 좋은수열 (C++) https://www.acmicpc.net/problem/2661 2661번: 좋은수열 첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다. www.acmicpc.net 문제 : 1, 2, 3으로만 이루어지는 수열이 있다. 임의의 길이의 인접한 두 개의 부분 수열이 동일한 것이 있으면, 그 수열을 나쁜 수열이라고 부른다. 그렇지 않은 수열은 좋은 수열이다. 처음에는 특정한 규칙이 있을 것같았지만, 손으로 몇개 나열해보니 규칙을 찾기가 어려웠다. 따라서, 백트래킹을 통해 작은 수부터 모든 경우의 수를 탐색하면서 좋은수열이면 즉시 종료하였다. 여기서, 중요한건 좋은수열인지 체크하.. 2021. 9. 26.
[백준] 2671번 : 잠수함식별 (C++) https://www.acmicpc.net/problem/2671 2671번: 잠수함식별 입력에 들어있는 스트링을 읽고, 이것이 잠수함의 엔진소리를 나타내는 스트링인지 아니면 그냥 물속의 잡음인지를 판정한 후, 잠수함의 엔진 소리에 해당하는 스트링이면 "SUBMARINE"을 출력하고 www.acmicpc.net 2가지 방법을 이용하여 풀었다. 1. 문자열 처리 (이런 패턴을 찾아서 푸는걸 Finite Automata라고 부르는것 같다) 2. 정규표현식 Regex을 이용 이 문제에서는 (100~1~|01)~ 에 해당하는 패턴을 찾는 것이었다. 따라서, 모든 문자열은 100~1~ 와 01의 조합으로만 구성되어야 한다! 각각의 조합을 1번과 2번이라고 해보자. 1번 : 100~1~ 2번 : 01 맨 앞문자가 .. 2021. 9. 25.
[백준] 1647번 : 도시 분할 계획 https://www.acmicpc.net/problem/1647 1647번: 도시 분할 계획 첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 www.acmicpc.net 최소비용 문제로 크루스칼 알고리즘을 사용하였다. 이 문제에서 주어진 추가적인 조건은 두개의 마을로 분할해서 최소비용을 구하는 것이었다. 따라서, 일반적인 크루스칼 알고리즘을 통해 모든 정점을 이어서 구할 수 있는 최소 비용을 구한 후 선택된 간선들 중 가장 큰 가중치값을 갖는 간선치를 빼주었다. 해당 마을을 분할해주면 되기 때문이다. 전체 코드는 다음과 같다... 2021. 9. 24.
[Database] 관계대수와 SQL 관계 데이터 모델의 두가지 언어 1. 관계 해석 : 원하는 데이터만 명시하고 질의를 어떻게 수행할 것인가는 명시하지 않는 선언적 언어 2. 관계 대수 : 어떻게 질의를 수행할 것인가를 명시하는 절차적 인어 관계 대수 기존의 릴레이션으로 부터 새로운 릴레이션을 생성 기본적인 연산자들이나 집합으로 구성 결과 릴레이션은 또다른 관계 연산자의 입력으로 사용가능 관계 연산자 셀렉션 : 한 릴레이션에서 셀렉션 조건을 만족하는 튜플들의 부분집합으로 중복된 튜플들이 존재할 수 없다. 프로젝션 : 한 릴레이션에서 애트리뷰트 리스트에 해당하는 애트리뷰트들의 부분집합으로 중복된 튜플이 존재할 수도 있다. 합집합 : 두 릴레이션의 합집합 차집합 : 두 릴레이션의 차집합 카티션 곱 : 두 릴레이션에서의 튜플들로 만들수 있는 모.. 2021. 9. 23.
[백준] 2003번 : 수들의 합 2 (C++) https://www.acmicpc.net/problem/2003 2003번: 수들의 합 2 첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다. www.acmicpc.net 연속된 숫자들의 부분합이 M이 되는 경우를 구하는 문제이다. for문으로 무작정 구현하면 시간초과가 나기 때문에, 두 포인터를 사용해서 효율성을 고려해야 하는 문제였다. (만약 주어진 숫자들이 자연수가 아니라면 두 포인터를 사용할 수 없다.) Two Pointers 는 1차원 배열에서 두 개의 포인터를 조작하여 원하는 결과를 얻는 알고리즘으로, 최악의 경우.. 2021. 9. 22.
[백준] 1920번 : 수 찾기 (C++) https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들 www.acmicpc.net 이분 탐색으로 구현하였다. 이분 탐색 시작 전, 배열을 오름차순 정렬하는 걸 잊지말자! #include #include #include using namespace std; int N, M; int n; int arr[100000]; int solve(int n) { int start = 0; int end = N-1; while (start > N.. 2021. 9. 21.