728x90
반응형

간단한 수학 문제이다.

7 -> 12 -> 22 -> 35 ... -> 처음에는 7 다음에는 10 그다음에는 13을 더하는 패턴이다.

add라는 변수를 7에서 시작해서 3을 더하면서 ans에다 계속 더해주면 된다.

ans = 5
add = 7
for i in range(int(input()) - 1):
    ans += add
    add += 3
print(ans%45678)

728x90
반응형
728x90
반응형

정렬하고 풀면 쉽다.

N = int(input())
M = int(input())
li = sorted(list(map(int, input().split())))
ans = 0
s, e = 0, len(li)-1

while s != e:
    if li[s] + li[e] == M:
        ans += 1
        e -= 1
    elif li[s] + li[e] < M:
        s += 1
    elif li[s] + li[e] > M:
        e -= 1
        
print(ans)

728x90
반응형
728x90
반응형

그리디 알고리즘 문제이다. 정렬을 사용하면 쉽게 풀 수 있다!

lambda를 사용해 끝나는 시간과 시작하는 시간 순으로 두 번 정렬해주는 게 핵심이다. 

li = [list(map(int, input().split())) for _ in range(int(input()))]
li.sort(key=lambda x : (x[1], x[0]))
cnt = 1
end_time = li[0][1]
for i in range(1, len(li)):
    if li[i][0] >= end_time:
        cnt += 1
        end_time = li[i][1]
print(cnt)
728x90
반응형
728x90
반응형

최소공배수는 최대공약수를 안다면 쉽게 구할 수 있다.

-> 최소공배수 = a * b // a와 b의 최대공약수

최대공약수는 유클리우드 호제법을 통해 쉽게 구할 수 있다.

# 유클리우드 호제법은 이런 종류의 문제를 풀 때 자주 사용하게 되므로 기억해놓으면 좋다.

for _ in range(int(input())):
    a, b = map(int, input().split())
    a, b = max(a, b), min(a, b)
    s = a*b
    
    while(b != 0):
        n = a%b
        a = b
        b = n
    
    print(s//a)

728x90
반응형
728x90
반응형

우선 False가 100개 달려있는 리스트를 생성한다. 

그 후 앉고 싶어 하는 자리가 False인 경우에는 True로 바꿔주고 앉고 싶어 하는 자리가 True라면 거절당한 상황이므로

cnt를 올려주면 된다.

N = int(input())
li = [False] * 100
p = list(map(int, input().split()))
cnt = 0

for n in p:
    if li[n-1] == False:
        li[n-1] = True
    else:
        cnt += 1
        
print(cnt)

728x90
반응형
728x90
반응형

그냥 말 그대로 "문제의 정답"을 출력하면 되는 문제다. 

백준씨는 어쩌다 이런 문제를 올렸을까...

print("문제의 정답")

728x90
반응형
728x90
반응형

A, B 리스트를 받을 때 각각 오름차순, 내림차순으로 정렬한 후 각 요소들의 곱의 합을 구하면 된다.

EX) A = [1,1,1,6,0], B = [2,7,8,3,1] 

A 오름차순 정렬 -> [0,1,1,1,6]

B 내림차순 정렬 -> [8,7,3,2,1]

곱의 합 = 0*8 + 1*7 + 1*3 + 1*2 + 6*1 = 0 + 7 + 3 + 2 + 6 = 18

n = int(input())
A = sorted(list(map(int, input().split())), reverse=True)
B = sorted(list(map(int, input().split())))
S = 0

for i in range(n):
    S += A[i]*B[i]
print(S)

728x90
반응형
728x90
반응형

에라토스테네스의 체 문제이다. 소수를 찾는 방법 중에서 이 방법은 상당히 빠른 편인 것 같다.

n1, n2= map(int, input().split())
li = [1]*(n2+1)
for i in range(2, int((n2+1)**0.5) + 1):
    if li[i] == 1:
        for j in range(i+i, n2+1, i):
            li[j] = 0
for i in range(n1, n2+1):
    if li[i] == 1 and i > 1:
        print(i)

728x90
반응형
728x90
반응형

EX) 12월 25일 

s = sum(li[:11]) + 25 = 334 + 25 = 359

d[359%7] = d[2] = 'TUE'

li = [31,28,31,30,31,30,31,31,30,31,30]
x, y = map(int, input().split())
d = ['SUN','MON','TUE','WED','THU','FRI','SAT']
s = sum(li[:x-1]) + y
print(d[s%7])

728x90
반응형
728x90
반응형

두 단어의 알파벳 개수들의 차이의 합을 구하면 된다.

s1 = input()
s2 = input()
ans = 0
a, b = [0]*26, [0]*26

for i in range(len(s1)):
    a[ord(s1[i])-97] += 1
for i in range(len(s2)):
    b[ord(s2[i])-97] += 1
for i in range(26):
    ans += abs(a[i]-b[i])
print(ans)

728x90
반응형
728x90
반응형

그냥 수학 문제이다.

간단한 조건에서 연립방정식을 세우고 첫 번째 값을 찾다 보면 아래의 방식이 이해가 될 것이다.

n = int(input())
s = 0
li = []
for i in range(n):
    li.append(int(input()))  
    s += li[i] * (-1)**i
a = s // 2

print(a)
for i in range(n-1):
    a = li[i] - a
    print(a)

728x90
반응형
728x90
반응형

단순한 방식

입력보다 커지기 전까지 1, 2, 3, 4, 5... 를 계속 더하다가 마지막으로 더해진 값을 출력해주면 된다.

1부터 n까지 수의 합 = n * (n+1) // 2

n = int(input())
i = 1
while i * (i+1) // 2 <= n:
    i += 1
print(i-1)

 

이분 탐색

마찬가지로 1부터 n까지 수의 합 = n * (n+1) // 2 인 점을 이용하면 쉽게 해결할 수 있다.

n = int(input())
s, e = 1, n
while s <= e:
    m = (s + e) // 2
    print(s, e, m)
    if m * (m+1) // 2 > n:
        e = m - 1
    else:
        ans = m
        s = m + 1
print(ans)
728x90
반응형
728x90
반응형

우선 듣도 못한 사람의 이름을 set에 저장한다.

그 후 보도 못한 사람의 이름이 set에 들어있지 않다면 듣도 보도 못한 사람 리스트에 이름을 추가하면 된다.

a, b = map(int, input().split())
s = set()
li = []
for _ in range(a):
    s.add(input())
for _ in range(b):
    name = input()
    if name in s:
        li.append(name)
print(len(li))
for c in sorted(li):
    print(c)

728x90
반응형
728x90
반응형

A + B * x < C * x ->  A < (C - B) * x 식을 만족하는 x의 최솟값은 A // (C - B) + 1이다.

A, B, C = map(int, input().split())
if B >= C:
    print(-1)
else:
    print(A//(C-B)+1)

728x90
반응형
728x90
반응형

팩토리얼 결과값을 str로 변경하고 뒤에 0이 몇개 있는지 확인하면 된다.

허나 입력이 커진다면 시간초과가 뜰 것이다.

import math
n = str(math.factorial(int(input())))
l = len(n)
for i in range(l):
    if n[l-i-1] != '0':
        break
print(i)

뭔가 효율적인 방법이 있지 않을까해서 찾아본 결과 아래의 방식을 찾을 수 있었다.  

n = int(input())
t = n
n2, n5 = 0, 0
while(t != 0):
    t //= 2
    n2 += t
while(n != 0):
    n //= 5
    n5 += n
print(min(n2, n5))

728x90
반응형

+ Recent posts