백준 10610번 30 문제

 

 

 

이 문제를 보자마자, 아 permutation을 써서 나올 수 있는 모든 경우의 수중 30으로 나누어 떨어지는 수의

최대 값이 정답이겠구나! 라는 생각이 들어 코드를 짜보았으나.. 결과는 시간초과였다.

 

최초 코드의 시간 초과

 

from itertools import permutations
n = input()
data = []

for i in permutations(n, len(n)):
    tmp = int("".join(i))
    if tmp % 30 == 0:
        data.append(tmp)

if data:
    print(max(data))
    exit()

print("-1")

 

시간 초과가 된 코드는 바로 이것인데, 순열의 경우의 수가 10^5 까지 간다면, 그만큼 시공간 복잡도의 수가 기하급수적으로 늘어나게 됨을 간과하였다.

 

 

 

 

 

문제를 다시 곰곰히 살펴보니, 30의 배수가 되는 가장 큰 수 를 만들라는게 제일 큰 힌트였다.

 

30의 배수 -> 3의 배수 이면서 10의 배수.

결국 최대 값이면서, 맨 오른쪽 끝이 0으로 끝나야하니

입력받은 값을 역순으로 정렬하여 그 값이 30으로 나누어 떨어지기만 하면 되는 것이다.

 

n = list(input())
n.sort(reverse = True)
n = int("".join(n))
if n % 30 == 0:
    print(n)
else:
    print("-1")

수정 후 정답 코드

이렇게 쉽게 풀수 있었던 걸 너무 고전하였던 것 같다.

문제를 잘 읽어보는 습관을 들이자.

백준 2217번 로프 문제

 

로프와 중량, 물리학적인 성질을 띈 문제여서 너무 어렵게만 생각했나보다.
문제에서 주어진 '최대 / 최소'를 잡아내어 그리드로 풀면  바로 풀리는 문제였다.
문제를 다각적인 시야로 보는 연습을 해야지.

 

 

n = int(input())
lopes = []
result = []

for _ in range(n):
    lopes.append(int(input()))
lopes.sort(reverse= True)


for i in range(len(lopes)):
    result.append(lopes[i] * (i + 1))

print(max(result))

 

백준 1026번 보물 문제

 

배열의 길이 = N

정수 배열 A, B

함수 S =  A[0] * B[0] + .... + A[N - 1] * B[N - 1]...

 

즉 A와 B를 순서대로 곱해서 그 값을 누적합 해 최소의 값을 구해내라는 문제이다.

즉 A의 제일 작은 값과 B의 제일 큰 값을 계속해서 연산한다면 최소값이 나올 것 이다.

 

A의 배열을 오름차순으로, B의 배열을 내림차순으로 정렬한 후 계산해주었다.

 

n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))

a.sort()
b.sort(reverse = True)
result = 0

for i in range(len(a)):
    result += a[i] * b[i]

print(result)

백준 1759번 암호 만들기 문제

 

만들어야 할 암호의 문자 수 L

주어질 문자들의 개수 C

 

즉 C개의 문자들 중에서 L개를 뽑아야 하는데, 조건이 있다

바로 최소 한 개의 모음과 최소 두개의 자음으로 구성되어야 한다. 라는 것

 

따라서 이 문제를 푸는 방법을 생각해보자면

1. C개의 문자에서 L개를 뽑는다 -> 조합 -> itertools의 combinations를 사용

2. 추가 조건을 만족시키기 위해 combinations의 결과값을 if로 걸러준다.

 

from itertools import combinations

vowels = ('a', 'e', 'i', 'o', 'u')
l, c = map(int, input().split())

array = input().split(' ')
array.sort()

for password in combinations(array, l): # l개 만큼의 비밀번호 후보군을 생성
    vowel_count = 0
    for i in password:
        if i in vowels:
            vowel_count += 1
    if 1 <= vowel_count <= l - 2: # 해당 후보군이 조건에 맞는지 판단 (자음/모음개수)
        print(''.join(password)) # join 함수로 출력 형식 맞춰주기.

+ Recent posts