알고리즘

TIL] 알고리즘 문제풀이 [백준] (1037, 2609, 10250)

Nerd 2021. 6. 17. 00:55

알고리즘 문제풀이

1037번

# 양수 A가 N의 진짜 약수가 되려면, N 이 A의 배수이고, A가 1 과 N이 아니어야 한다.
# 어떤 수 N의 진짜 약수가 모두 주어질 때, N을 구하는 프로그램
# N은 약수의 개수

N = int(input())
A = list(map(int, input().split()))

max_number = max(A)
min_number = min(A)

print(max_number * min_number)

# 약수가 모두 주어지기 때문에 가장 작은 값과 가장 큰 값을 곱하면 진짜 수를 구할 수 있다.

2609번

# 두 개의 자연수를 입력받아 최대 공약수와 최소 공배수 구하기
# 문제 접근 방식 :
# 최대공약수: a 와 b의 최대공약수는 b 와 a를 나눈 나머지의 최대공약수와 같다.
# 최소공배수: a 와 b의 최소공배수는 a*b/최대공약수(a,b)를 해주면 최수 공배수가 된다.
# 최소공배수가 되는 이유는 이 수를 a와 b 모두 나누어떨어지고 나누어 떨어지는 수 중 가장 작은 수이기 때문이다.

l, r = map(int, input().split(' '))


def gcd(a, b):
    mod = a % b
    while mod > 0:
        a = b
        b = mod
        mod = a % b
    return b


def lcm(a, b):
    return a * b // gcd(a, b)


print(gcd(l, r))
print(lcm(l, r))

10250번

# h는 층 수 , w는 각 층의 방 수, n은 손님 수
# 각 손님은 층 수는 상관 없고 호수가 작은 걸 선호
# 만약 6층에 각 방이 12개가 있다면 10번 째 온 손님은 402호


rooms = int(input())

for i in range(rooms):
    h, w, n = map(int, input().split(' '))  # h(층 수) , w(방의 수), n(손님)
    f = 0  # f 는 층 수 저장소
    ho = 0  # ho 는 호실 수 저장소
    if n % h == 0:  # 딱 나눠떨어진다면
        f = h * 100  # 층 수는 100 200 300 이런식이기에 100을 곱해준다.
        ho = n // h  # 나누어 떨어질 때는 몫을 바로 호수로 해준다.
    else:
        f = (n % h) * 100  # n 에 h를 나눴을 때 나머지를 층 수
        ho = 1 + n // h  # 나누어떨어지지 않을 때는 나머지 + 1을 호수로 해준다.
    print(f + ho)

# h : 6  | w : 12  | n : 10  |
# n : 10 % h : 6 = 4
# 4 != 0
# f = 400 ho = 2
# print (402)

# -------------------------------------

# h : 6  | w : 12  | n : 12  |
# n : 12 % h : 6 = 0
# 0 == 0 (T)
# f = 600 ho = 2
# print(602)

확실히 문제 난이도가 올라가는 것이 느껴진다!

알고리즘 자체가 아직은 너무 어려워서 문제다!

하지만 날이 갈수록 뭔가 안보이던 것이 보이고

문제 접근방식이 완전 처음과는 달라지는 것 같아서

불가능은 없다는 것을 느끼고 있다!

아직은 많이 어렵지만 열심히 공부해서

문제에 대한 접근을 잘할 수 있게끔 열심히 해야겠다!

파이팅👍👍👍✍️✍️✍️