백준 10610번 - 30

백준 10610번 바로가기 나의 풀이 주어진 숫자를 재조합해서 30의 배수를 만드는 문제. $ 30 = 3 * 10 $ 이므로 두 가지를 확인하면, 30의 배수를 만들 수 있는지 알 수 있다. 주어진 숫자에 0이 포함되는가 각 자리의 합이 3의 배수인가 (3의 배수 판별법) 만들 수 있는 최대 숫자는 각 자리를 내림차순 정렬하면 쉽게 구할 수 있다. # 입력 import sys n = str(sys.stdin.readline().strip()) nums = list(map(int, list(n))) # 처리 if '0' in n and sum(nums) % 3 == 0: print(''.join(map(str, sorted(nums, reverse=True)))) else: print(-1)

2023-7-14 · 1 min · 84 words · Junha

백준 2217번 - 로프

백준 2217번 바로가기 나의 풀이 각 로프에 걸리는 최대 중량은 사용한 로프 중 최대 중량의 최솟값이다. (즉, 최대의 최소의 개념!) 따라서 각 로프의 중량을 오름차순으로 정렬한 뒤에 하나씩 뽑아서 그 로프의 최대 중량을 기준으로 들 수 있는 최대 중량을 구했다. 식으로 나타내자면 $ max_{total} = min_{rope} * num_{ropes} $ 이를 코드로 나타내면 다음과 같다. # 입력 import sys n = int(sys.stdin.readline()) rope = [] weight = [] for _ in range(n): rope.append(int(sys.stdin.readline())) rope = sorted(rope) # 처리 for i in range(n): weight.append(rope.pop(0)*(len(rope)+1)) print(max(weight))

2023-7-14 · 1 min · 83 words · Junha

백준 1541번 - 잃어버린 괄호

백준 1541번 바로가기 나의 풀이 # 입력 import sys read = sys.stdin.readline eq = read().strip().split('-') ans = eq[0] if '+' in ans: ans = sum(map(int, ans.split('+'))) else: ans = int(ans) # 처리 for e in eq[1:]: if '+' in e: e = sum(map(int, e.split('+'))) ans -= int(e) print(ans) 고수의 풀이 a,*b=[sum(map(int,s.split('+')))for s in input().split('-')];print(a-sum(b)) 출처 CODE REVIEW 먼저 - 부호로 split 해준 뒤에 각각의 sum을 구하고 차례대로 빼주면 최솟값을 얻을 수 있다. 고수의 풀이를 보면 a-sum(b)로 풀어내었는데, for문을 한 번만 써도 풀어냈다…! 깔끔하구만

2023-6-5 · 1 min · 83 words · Junha

백준 11047번 - 동전 0

백준 11047번 바로가기 나의 풀이 import sys n, k = map(int, sys.stdin.readline().split()) coins = set() for _ in range(n): coins.add(int(sys.stdin.readline().rstrip())) count = 0 current = k for c in sorted(coins, reverse=True): if current == 0: break count += (current//(c:=int(c))) current = current%c print(count) CODE REVIEW k원을 만드는데 필요한 동전의 최소 갯수를 구하는 문제. 몫과 나머지를 다루는 문제를 풀어봤다면 쉽게 해결할 수 있었다. set은 sort()메소드를 직접 사용할 수 없기에, sorted()로 감싸고, parameter로 reverse=True를 넣어주면 쉽게 해결 가능하다.

2023-6-3 · 1 min · 76 words · Junha

백준 11399번 - ATM

백준 11399번 바로가기 나의 풀이 # 입력 import sys n = int(sys.stdin.readline().rstrip()) time = list(map(int,sys.stdin.readline().split())) atm = 0 # 처리 for i in range(n): atm += sorted(time)[i] * (len(time)-i) print(atm) CODE REVIEW 최선의 방법은 소요시간이 적은 사람부터 ATM을 사용하도록 하는 것이다. 최소 시간인 사람이 len(time)만큼 누적해서 걸리고, 그 다음부터는 -1번 씩 줄어나가며 시간이 걸린다.

2023-6-3 · 1 min · 54 words · Junha