
이 문제는 초기 문자열과 만들어야하는 문자열이 주어질 때, 각 위치의 스티커를 떼고 붙이고, 구매 등의 방법을 사용해 만들어야하는 문자열이 초기 문자열의 부분 문자열이 되도록 하는 최소값을 구하는 문제이다. 문제 설명만 봤을 때는 어려워 보일 수도 있지만 문자열의 길이가 500이 안되기 때문에 모든 경우를 탐색하면서 최소값을 계산해주면 된다. 부분 문자열을 만들 수 없는 경우 -1을 출력하라고 되어있는데, 이는 구매할 수 있는 스티커 중에 부분 문자열에 필요한 스티커가 없을 때 -1을 출력해주면 된다. 부분 문자열을 만들기 위해서 부분 문자열에 해당될 부분 중, 바꿔야 될 부분의 스티커를 모두 떼준다. 그후 뗀 스티커와 다른 범위에 있는 스티커까지 고려해서 어느걸 고르는 것이 최소값이 되는지 판단해주면 ..

이 문제는 입력된 9개의 숫자 중 합이 100이 되는 7개의 숫자를 고르면 되는 문제인데, 이를 다시 생각해보면 나머지 두명의 값을 제외했을 때 100이 되는 경우를 고르는 문제로 바꿀 수 있다. 이 경우 2중 반복문을 통해 두 수의 합을 전체 합에서 뺀 값이 100이 된다면 해당 두값을 제외한 나머지 값들을 출력해주면 된다. 문제가 스페셜 저지이므로 답이 여러개가 될 수 있기 때문에 여러가지 답이 나올 수 있지만 맨처음에 나온 값을 출력해주면 된다. n=9 l=[int(input())for i in range(n)] l.sort() s=sum(l) nanjaeng=[0,0] for i in range(n): for g in range(n): if i!=g and s-100==l[i]+l[g]: nanj..
완전 탐색 또는 브루트 포스라고 불리는 이 알고리즘은 이름 그대로 모든 경우의 수를 다 탐색해 보는 것을 말한다. 예를 들어 입력으로 들어온 N 개의 수 중, 서로 다른 숫자를 더했을 때 짝수가 되게 하는 경우의 수를 구하는 코드를 작성해야 될 때 완전 탐색을 이용하면 이렇게 작성할 수 있다. n=int(input()) l=list(map(int,input().split())) cnt=0 for i in range(n): for g in range(n): if i!=g and (l[i]+l[g])%2==0: cnt+=1 print(cnt) 이렇게 작성하면 위 문제에서 원하는 답을 구할 수 있고, 해당 코드의 시간복잡도는 O(N^2)가 된다. 해당 문제 같은 경우 O(N)에 계산하는 방법이 존재하는데, 이..

학교 수업량 우연화에 참여하여 제작한 프로젝트이다. 내용은 이름 그대로 개체의 다양성에 변화를 주면 생태계 평형이 어떻게 깨지는지 관찰하고 이에 대한 해결책을 직접 해봄으로서 생태계 다양성을 보전하는 자세를 기르자는 탐구보고서 이다. 이를 위해 파이썬으로 간단하게 시뮬레이션을 구현하였고, 이를 이용해 남획, 외래종 유입 등 다양한 방법에 대해 생태계를 관찰하는 활동을 하였다. https://github.com/python-programmer1512/Ecosystem_Diversity_Change_Simulation GitHub - python-programmer1512/Ecosystem_Diversity_Change_Simulation Contribute to python-programmer1512/Ec..

위 그림처럼 예선에 합격했다. 6월에 예선 주제가 올라온 걸 확인하고 주제를 선정하고 7월에 시험을 끝낸 후에 본격적인 개발을 진행하였다. 개발한 프로젝트는 경구약 안전 복용 서비스인데, 이름 그대로 경구약(우리가 먹는 일반적인 약들을 말함)을 먹는데 어려움이 있는 사람들을 위해 flask로 제작한 웹사이트에서 약에 대한 이미지를 입력받으면 약을 인공지능과 OCR을 사용하여 판별하고 결과를 웹사이트에서 텍스트와 음성으로 출력해 주는 서비스이다. 학교 행사와 공부, 개발을 같이 하다 보니 시간이 많이 부족했고, 특히 에러 때문에 코드를 여러 번 갈아엎어서 시간이 더욱 없었다.(일주일 동안 에러 때문에 진도를 못 낸 적 있음) 같이할 사람들도 모집을 못해서 혼자 하기 때문에 더욱 힘들었는데 다행히 마감 5분..

이 문제를 요약하면 N개의 수를 나열하고, 연속된 수들로 모둠을 여러 개 만든다. (1개에서 N까지 다양하게) 그때, 각 모둠끼리는 모두 직접 연결되어 있어야 하는데 그렇지 않을 경우, 부족한 개수만큼 점수가 오른다. 또 자신의 모둠이 아닌 다른 모둠과 연결되어 있을 때에도 개수만큼 점수가 오른다. 이때 점수의 최솟값을 찾는 문제이다. 이 그림으로 예를 들면, 이 그림에는 모둠이 2개가 존재하는데, 왼쪽에 있는 모둠은 내부에서 부족한 간선의 수는 3개가 되고, 오른쪽에 있는 모둠은 1개, 두 모둠을 잇는 간선 1개로, 이 그림은 5점을 가진다. 이 문제의 N의 범위는 2000 이하 이기 때문에 완전탐색은 통하지 않는다. 그럼 어떻게 풀 수 있을까? 누적 합과 dp 를 사용하면 풀 수 있다. dp [i]를..

문제를 요약하면 동그라미, 세모, 네모를 같은 모양이 연속으로 나열되도록 최소 횟수로 바꾸는 문제이다. 이문제에서 입력이 1,2,3 즉 동그라미, 세모, 네모만 존재하기 때문에 이 3개의 도형을 배치할 수 있는 경우의 수 6개를 반복문으로 탐색하면서 최소 개수를 구해주는 방식을 떠올릴 수 있다. 그다음은 어떻게 최소 개수를 구하냐 인데, 일단 두 도형을 바꿨을 때, 두 도형이 모두 최종적으로 있어야 하는 구간에 들어간다면 이 방법이 두 도형의 최소 변경 횟수가 될 것이다. 예를 들어보자. 1 3 3 2 1 1 3 2 라는 입력이 들어오고, 3 2 1 순서로 나타난다고 해보자. 그러면 최종적으로 3 3 3 2 2 1 1 1 을 만들어야 한다. 초기 입력을 숫자의 개수에 따른 구간을 나눠 보면 1 3 3 |..

요약하면 그래프가 주어지고, Q개의 쿼리에서 X, Y 가 주어지면 X, Y에서 시작하는 스패닝 트리의 최솟값을 구하라는 문제이다. 기존 스패닝 트리와는 다르게 두 점 X, Y에서 스패닝 트리가 시작할 수 있는데 이는 즉, 한 그래프 안에서 스패닝 트리가 2개가 나올 수도 있다는 소리가 된다. 그럼 이를 어떻게 해결할 수 있을까? 그 방법은 스패닝 트리의 특징을 생각해보면 알 수 있다. 스패닝 트리는 N개의 점에 대해 N-1 개의 간선을 가진다. 또 문제에선 X,Y 에서 시작하는 최소 스패닝 트리를 요구하기 때문에 N-1 간선에서 최대 1개의 간선을 제거할 수 있다. 간선을 2개 이상 제거 할 경우, 어떠한 점을 연결할 수 없게 된다. 그러므로 최대 선 1개만 지울 수 있다, 음수 가중치가 없기 때문에 선..
- Total
- Today
- Yesterday
- KOI
- 구현
- 그래프 이론
- 수학
- 선분 교차 판정
- 정렬
- C++
- A Dance of Fire and Ice
- codeforces
- 이분매칭
- 느리게 갱신되는 세그먼트 트리
- 잡봇
- 그래프 탐색
- 최소 스패닝 트리
- BOJ
- 트리
- 다이나믹 프로그래밍
- 이분 탐색
- 개발
- 깊이 우선 탐색
- 완전 탐색
- discord bot
- 알고리즘
- 그리디 알고리즘
- 자료 구조
- Python
- 트리에서의 다이나믹 프로그래밍
- 자료구조
- 누적 합
- 세그먼트 트리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |