본문 바로가기

알고리즘

(82)
백준 [10986] 참외밭(Python3) 문제 링크 : https://www.acmicpc.net/problem/2477 2477번: 참외밭 첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지 www.acmicpc.net 완전 탐색 선에서 해결할 수 있는 문제. 처음엔 ㄱ 형태를 통해 만들어진 온갖 형태를 고려해야 하나 걱정했는데 지문에서 6각형이고, 이동한 순서대로 입력이 들어온다고 써져있어 쉽게 풀 수 있었다. 파이썬이 인덱스 처리에 관대하기 때문에 파이썬을 쓴다면 생각보다 쉽게 풀 수 있다. 먼저 큰 직사각형의 넓이를 구한 뒤, 공백이 생기는 작은 사각형의 넓이를 구해 빼는 식으로 문제를 해결..
백준 [2477] 수열의 합(Python3) 문제 링크 : https://www.acmicpc.net/problem/1024 1024번: 수열의 합 첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다. www.acmicpc.net 수학적 사고가 요구되는 문제. 뭔가 누적합을 사용할 수 있을 거 같아서 여기에 대해 1시간 정도 고민하다 도저히 안 돼서 풀이를 봤다. 완전 탐색 1부터 1,000,000,000까지 돌면서 각 지점에서 2부터 L까지의 합을 구한다. 총 시간 복잡도 O(N * (L - 2))로, N과 L이 최대 값일 때 시간 초과 완전 탐색 최적화 - 누적합 사용. 1부터 1,000,000,000까지의 누적합을 구한 뒤, 한 지점을 정하고 ..
백준 [10986] 나머지 합(Python3) 문제 링크 : https://www.acmicpc.net/problem/10986 10986번: 나머지 합 수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) www.acmicpc.net 지문 해석 연속된 부분 구간의 합을 보고 바로 누적합을 써야 한다는 것을 알았다. 완전 탐색 누적합 배열이 있을 때, 한 누적합을 기준으로, 그 이전 위치의 누적합과 차를 비교해 M의 배수가 되는 쌍을 센다. -> O(N^2)로 시간 초과 완전 탐색 최적화 - 탐색 범위 줄이기 누적합은 계속 커진다는 점을 이용해 두 누적합의 차가 M보..
백준 [1090] 체커(Python3) 문제 링크 : https://www.acmicpc.net/problem/1090 1090번: 체커 N개의 체커가 엄청 큰 보드 위에 있다. i번 체커는 (xi, yi)에 있다. 같은 칸에 여러 체커가 있을 수도 있다. 체커를 한 번 움직이는 것은 그 체커를 위, 왼쪽, 오른쪽, 아래 중의 한 방향으로 한 칸 www.acmicpc.net 좌표 다루는 문제는 경험이나 스킬이 부족해서 잘 풀지 못했는데 이번에 학회 내의 랑이집사 님의 특강을 통해 완전탐색을 통한 문제 추론 과정 설명을 듣고 거기에 맞춰 풀었다. 참고한 블로그 링크 : https://m.blog.naver.com/PostView.naver?blogId=gojib2002&logNo=222207408308&proxyReferer=https:%2F%..
프로그래머스 - [1차] 뉴스 클러스터링 들어가기 전에 문제를 해결하기 위해 어떤 생각을 했는지 기록하기 위해 쓰는 글입니다. O(10^8)의 계산을 1초라 가정했습니다. 잘못되거나 개선이 필요한 부분 지적은 언제나 환영입니다! 지문 해석 두 문자열 str1, str2을 upper나 lower를 통해 대문자나 소문자로 변환해야 한다 변환된 문자를 슬라이딩 윈도우를 통해 특수문자가 있는지 확인하고, 없다면 배열에 추가한다. 각각 시간 복잡도가 O(n)이 나온다. 그 후, 슬라이딩 윈도우의 결과를 가지고 교집합과 합집합을 구한다. 여기서 주의할 점은 교집합을 구하는 과정에서 교집합이 된 쌍은 다음 교집합 확인에서 제외해야 한다. 예를 들자면 A = {1, 1, 2, 2, 3}, B = {1, 2, 2, 4, 5} 의 교집합에서 A[0] = 1과 B..
백준 [13913] 숨바꼭질4(Python3) 지문 해석 현재 위치를 X라 할 때, 일정한 범위 (X - 1, X + 1, X * 2)를 탐색한다. 매 이동엔 1초가 필요하니, 큐를 이용하는 BFS 방식이 필요했다. 방문 여부 체크에 관해서는 Boolean 값이면 충분했다. 최적의 탐색 비용의 경우, 큐 삽입 때, 기존 비용 + 1을 하면 간단히 해결됐다. 하지만, 지나온 경로를 표시하는 부분 해결에서 문제를 겪었다. 지나온 경로 문제 해결 1, 2번은 틀린 풀이다. 1. BFS 한 번 더 사용 데이터 범위가 작기 때문에 N -> K로 가는 BFS의 시간 복잡도가 적은것을 이용해 K -> N으로 다시 BFS를 할까 생각했다. 하지만, 이 과정은 코드가 너무 길어지고, 되돌아간 위치가 최단 경로 중 하나인지에 대한 검증이 필요했기 때문에 좋은 해결책이..
백준 [16564] 히오스 프로게이머(Python3) 들어가기 전에 문제를 해결하기 위해 어떤 생각을 했는지 기록하기 위해 쓰는 글입니다. O(10^8)의 계산을 1초라 가정했습니다. 잘못되거나 개선이 필요한 부분 지적은 언제나 환영입니다! 지문 해석 레벨을 올릴 수 있는 총합 K를 적절히 배분해서 얻을 수 있는 가장 높은 최솟값 T를 찾아야 한다. 브루트 포스로 해결한다면 최악의 경우 O(1,000,000 * 1,000,000,000) = O(10^15) 로 시간 초과를 받는다. 이분 탐색으로 해결한다면 O(1,000,000 * log(1,000,000,000)) O(1,000,000 * 29.8) = O(29,800,000) 로 해결할 수 있다. 이분탐색 범위 지정 N = 2 이고 X = {10, 10}, K = 1이라면, T의 값은 어떠한 경우에도 1..
카카오 코테 - 문자열 압축 문자열 길이로 판별하는 방식으로 풀었다. 정답 코드 더보기 def solution(s): half = len(s) // 2 answer = 1e9 if(len(s) == 1): answer = 1 for i in range(1, half + 1): base = s[0:i] count = 1 temp = 0 for j in range(i, len(s), i): current = s[j:j+i] if base == current: count += 1 else: temp += len(base) if count > 1: temp += len(str(count)) base = current count = 1 temp += len(base) if count > 1: temp += len(str(count)) ans..