알고리즘 문제 풀기 61

[백준 알고리즘] 11659. 구간 합 구하기 4 _ 파이썬

구간 합 구하기 문제입니다 구간 합인 경우 누적합을 이용하면 훨씬 빠릅니다!! 처음에는 그냥 for문을 돌려 그때그때 마다 sum을 계산하도록 하는 코드를 작성하였습니다. 그렇게 하니 채점은 저에게 시간초과를 선물해주더군요ㅠㅠ - 👨‍🎓 TIL → 함수가 1000번 이상 돌면 파이썬 내에서 recursionerror가 생겨 런타임 오류가 나타나므로 1000번이 돌아가지 않도록 코드를 짜거나, sys.setrecursionlimit()를 사용해 최대 재귀 깊이를 바꿔준다.(스터디장님께서는 꼼수라며..ㅎㅎ 더 나은 알고리즘을 고안해내기를 추천하셨다!) → 여러번 합을 계산하도록 하는 게 아니라, 한번 누적합을 계산해놓고 필요한 수를 추출하여 빼주는 것이 더 빠르다. → arr = [0] + list(map(..

[백준 알고리즘] 4344. 평균은 넘겠지(소수점 처리) - 파이썬

T = int(input()) for tc in range(1, T + 1): arr = list(map(int, input().split())) N = arr[0] scores = arr[1:] # 평균 s1 = 0 for i in scores: s1 += i ave = s1 / N # 평균을 넘는 학생 비율 count = 0 ratio = 0 for i in scores: if i > ave: count += 1 ratio = count/N*100 # 소수점 출력 print(f'{ratio:.3f}%') 🎈 소수점 출력시 문자열 포맷팅으로 처리하기!! 처음에는 round()로 하려고 했지만, round() 함수는 끝자리가 0이면 출력을 하지 않았습니다ㅠㅠ 위의 문제의 출력예제의 첫째 줄을 보면 40%..

[백준 알고리즘] 8958. OX퀴즈 - 파이썬

T = int(input()) for i in range(1, T+1): result = input() score = [] # O인경우 1, X인경우 0으로 리스트 생성 for i in result: if i == 'O': score.append(1) else: score.append(0) #누적합 만들기 for i in range(1, len(score)): # 해당 숫자가 1이고, 이전 숫자도 1인경우 이전 숫자에 +1한 값으로 변경 if score[i] and score[i-1]: score[i] += score[i-1] print(sum(score)) 🎈 많은 문제들이 리스트를 만들어 단순히 값을 저장하는 것에 넘어, 필요한 정보를 저장해놓고 활용한 경우가 많음! 위의 문제에서는 O인 경우 1로 ..

[SWEA 1206] View 조망권 구하기

💻 문제 풀이 접근 방법 1) 앞뒤에 2개씩 가지는 새로운 리스트를 만들고 2) 리스트 정렬시키고 3) 리스트의 맨 뒤의 숫자가 같은경우(즉, 해당 빌딩이 최댓값인 경우)에 그보다 작은 값 중의 최대인 값(list[-2])을 빼면 남은 세대들은 조망권을 가진다. 🎈 정렬시키지 않고 최댓값, 최솟값을 바로 추출하는 풀이로 하면 더 빠릅니다! 저는 강의시간에 배운 버블 정렬을 활용하여 풀어보았습니다:) for tc in range(1, 11): num = input() arr = list(map(int, input().split())) houses = [] ans = 0 for i in range(2, len(arr)-2): houses = [] houses = arr[i-2:i+3] # 정렬시키는 반복문 ..

[SWEA 1948] 날짜 계산기 2가지 풀이

months = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] for tc in range(1, int(input())+1): m1, d1, m2, d2 = map(int, input().split()) ans = 0 # 같은 달에 위치할 경우 if m1 == m2: ans = d2 - d1 + 1 else: # 시작하는 달 ans = months[m1] - d1 + 1 # 중간에 있는 달 for i in range(m1 + 1, m2): ans += months[i] # 마지막 달 ans += d2 print(f'#{tc} {ans}') for i in range(2, 13): months[i] += months[i-1] for tc in range(1, ..

[SWEA 1936] 가위바위보 2가지 풀이

이렇게 경우의 수가 6가지 밖에 나오지 않는 문제는 그냥 고민도 없이 바로 if A ==1 일때, A==2일때, A == 3일때 해서 풀곤 하는데 조금 더 짧게, 그리고 좀 더 스마트하게 쓸 수 있는 방법을 정리해보았습니다. A, B = map(int, input().split()) # 비기는 경우는 생각하지 않기 때문에 이렇게도 가능함. # A가 이기는 경우 if (A == 1 and B == 3) or (A == 2 and B == 1) or (A == 3 and B == 2) : print('A') # B가 이기는 경우 else: print('B') # 가위, 바위, 보 # 1 2 3 win = [0, 3, 1, 2] if A == B: print('비김') elif win[A] == B: prin..

[백준 알고리즘] 10828번 스택

말 그대로 스택을 구현하는 문제입니다. 명령어를 내리면, 그 명령에 맞는 행동을 하거나 결과값을 출력하는 건데요. 저는 이 문제를 통해 큰 깨달음을 하나 얻었는데요.. 바로 ".함수를 제대로 알고 쓰자!" 입니다. 함수 기능은 알고 있었지만, 그 미묘한 차이를 구분하지 않고 그냥 썼던 것이 발단이 되어 한시간을 헤매게 만들었습니다.. 원인은 바로 맨 마지막 줄인 pop이였는데요. 원래는 pop(-1)이 아닌 remove(stack[-1])로 했습니다. pop(-1), remove(stack[-1]) 둘다 stack =[1, 2, 3] 인 경우에는 두개 다 3을 반환해서 정상적으로 작동합니다. 하지만, stack = [2, 3, 4, 3] 인 경우에는? pop은 뒤의 3을 반환하게 되서 [2, 3, 4]가..

[백준 알고리즘] 11653번 소인수분해 _ 파이썬 python

www.acmicpc.net/problem/11653 11653번: 소인수분해 첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다. www.acmicpc.net 소인수분해는 결국 2부터 차례대로 돌릴 수밖에 없는데요. 여기서 핵심은 앞에 숫자에서 나눌 수 있을 만큼 나눈 다음에 다음 숫자로 넘어가야 합니다. 그래서 while을 사용하여 나눠질 때까지 계속 나누고 난 뒤 for문을 통해서 다음 숫자로 가는 방법으로 코드를 짰습니다. n = int(input()) if n == 1: print('') # 2부터 하나씩 나눠보기 for i in range(2, n+1): if n % i == 0: #해당 숫자로 나눌 수 없을 때까지 나누기 while n % i == 0: print(i) n =..

[백준 알고리즘] 11399번 ATM_ python 파이썬

https://www.acmicpc.net/problem/11399 11399번: ATM 첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000) www.acmicpc.net 최단시간을 구하는 방법은 시간이 적게 걸리는 사람 순으로 줄을 세우면 되는데요. .sort()를 이용하면 작은 순서대로 배열 됩니다. count = input() persons = list(map(int, input().split())) persons.sort() sum = 0 new = 0 for i in persons: new += i sum += new print(sum) 변수를 2개 사용하면 쉽게 해결됩니다. new는 ..

[백준 알고리즘] 은근히 까다로운 1712번 손익분기점 _ 파이썬

[1712번] 손익분기점 손익분기점을 구하는 문제입니다. 입력으로 A, B, C가 주어지는 데요. A는 고정비용 B는 가변비용, C는 판매로 얻는 수익(수입)입니다. 쉬운 듯하면서도 제대로 이해하지 못하면 헤매는 문제입니다. 💻 2가지로 분류해서 처리해야 합니다. 1) 손익 분기점을 달성하지 못하는 상태 : C(이익)이 B(가변비용) 보다 크지 않거나 같을 때 2) 손익 분기점을 달성할 수 있는 상태 C-B>0보다 클 때, C-B를 A(고정비용)으로 나누는 x값의+1 시점이 손익분기점이 됩니다. A, B, C = map(int, input().split()) # 손익분기점에 도달하지 못하는 경우 처리 if B >= C : print(-1) # 손익분기점 구하는 식 else: print(A//(C-B)+1..