목록알고리즘 & 코딩테스트 (73)
한 걸음씩 기록하며
프로그래머스에 SQL 테스트가 있길래 심심해서 쭉 한번 풀어봤는데, 거기서 몰랐던 부분이 있는 문제가 있어서 남겨봅니다. [입양 시각 구하기 (2)] 👉🏻 답안 SET @HOUR= -1; SELECT (@HOUR := @HOUR +1) AS HOUR, (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR) AS COUNT FROM ANIMAL_OUTS WHERE @HOUR < 23 📑 설명 SET 어떤 특정한 값을 할당할 떄 쓰는 명령어 @가 붙은 변수는 프로시저가 종료되어도 유지된다. 이를 통해 값을 누적하여 0부터 23까지 표현 가능 := 은 비교 연산자 =과 혼동을 피하기 위한 대입 연산 SELECT(@HOUR := @HOUR+1)은 @HO..
⛏ 문제 파악 주어진 수식을, 연산자의 우선순위를 부여하여 가장 큰 값으로 만드는 문제 (절대값) 순열 조합과 브루트 포스로 풀면 된다. 👉🏻 답안 import re from itertools import permutations def solution(expression): answer = 0 operation_list = list()#수식 안에 연산자들이 있는지 확인 (시간복잡도를 줄이기 위해) if '*' in expression: operation_list.append('*') if '+' in expression: operation_list.append('+') if '-' in expression: operation_list.append('-') operation_permutations = l..
⛏ 문제 파악 양 편의 다리 놓기 적절한 장소의 숫자를 제공한 뒤, 다리를 놓을 수 있는 경우의 수를 구하는 문제 조합론으로 풀면 간단하다. 👉🏻 답안 from math import factorial T = int(input()) result = 0 for _ in range(T): N, M = map(int, input().split(' ')) if N == M: result = 1 elif N > M: result = factorial(N) // (factorial(N-M) * factorial(M)) elif M > N: result = factorial(M) // (factorial(M-N) * factorial(N)) print(result) 📑 간단한 설명 우선 사랑스러운 파이썬의 math를..
⛏ 문제 파악 가장 작은 생성자를 구하는 문제 (분해합의 생성) 브루트 포스 방식으로 풀면 된다. 👉🏻 답안 N = int(input()) number = 1 while True: if N < number : number = 0 break temp = 0 for i in range(len(str(number))): temp += int(str(number)[i]) if number + temp == N: break number += 1 print(number) 📑 간단한 설명 자기 전에 빨리 풀려고 그냥 글을 코드로 바로 적어서.. while을 돌리고 안에 for문을 넣어서 진짜 브루트 포스 방식으로 풀었다. 다만 너무 비효율적인 것 같아서 다른 답안들을 보니, 생각해보니 굳이 while을 왜 썼지 내..
⛏ 문제 파악 새로운 블랙잭! N개의 카드가 주어지고, 그 중 3장을 뽑아 제시된 숫자 M과 가장 가까운 숫자를 만드는 알고리즘 브루트 포스 방식으로 풀면 된다. 👉🏻 답안 from sys import stdin N, M = map(int, input().split(' ')) cards = list(map(int, stdin.readline().split(' '))) length = len(cards) result = 0 for i in range(0,length): for j in range(i+1,length): for k in range(j+1,length): sum = cards[i]+cards[j]+cards[k] if M >= sum: result = max(result,sum) print(..
오늘 아래의 문제를 풀기 위해 브루트 포스 알고리즘 방법을 사용했다. 브루트 포스로 문제를 풀었으니, 본 글은 브루트 포스를 정리하고자 한다. https://haksae.tistory.com/187?category=948102 [백준] 1436번 영화감독 숌 ⛏ 문제 파악 숌이라는 영화감독이 666이라는 제목으로 작품을 만들어간다 할 때, N번째 작품명을 출력하는 문제 문제의 핵심은 666이 붙어있어야한다는 점. 즉 7번째 작품일 때 6666이 아니라 6660 haksae.tistory.com 1. Brute Force란? Brute : 무식한, 짐승, 동물 Force : 힘 이름에서 느껴지듯이, 매우 단순 무식한 알고리즘 방법으로, 완전 탐색 알고리즘이다. 즉 문제를 해결하기 위해서, 가능한 모든 경..
⛏ 문제 파악 숌이라는 영화감독이 666이라는 제목으로 작품을 만들어간다 할 때, N번째 작품명을 출력하는 문제 문제의 핵심은 666이 붙어있어야한다는 점. 즉 7번째 작품일 때 6666이 아니라 6660이어야 한다는 점이다. 문제 해결을 위해 브루트 포스(완전 탐색)을 사용했다. 브루트 포스에 대한 글은 따로 작성하겠다. 👉🏻 답안 N = int(input()) title = 666 count = 0 while True: if '666' in str(title): count += 1 if count == N: break title += 1 print(title) 📑 간단한 설명 665까지는 탐색하지 않아도 되기에, 666부터 title += 1 하였고 '666'이 속해있으면 count += 1을 하였..
⛏ 문제 파악 줄 서있는 사람 숫자와 해당 사람들의 인출 시간을 주고, 최소 시간을 구하는 문제 앞의 시간을 계속 더해야하니, 가장 시간이 적게 걸리는 사람을 앞에 배치하는 것이 최소값을 구하는 키 👉🏻 답안 from sys import stdin N = int(input()) waiting = list(map(int, stdin.readline().split())) waiting.sort() min = 0 for i in range(N): for j in range(0, i+1): min += waiting[j] print(min) 📑 간단한 설명 최소 시간을 구하기 위해, waiting을 오름차순으로 변경 이중 for문을 통해서, 각 기다리는 시간을 더하여 값을 구했다.