알고리즘 45

정렬 알고리즘 (버블정렬, 카운팅 정렬, 선택정렬) - 파이썬 예시코드

버블정렬 인접한 숫자를 비교하여 큰 숫자를 뒤로 (혹은 앞으로) 보내는 정렬 arr = [3, 4, 1, 5, 1] #리스트 전체 for문 돌리는 횟수 for i in range(len(arr), 0, -1): # 도는 범위를 전체길이의 1씩 감수시키며 둘씩 비교 for j in range(1, i): if arr[j - 1] > arr[j]: arr[j - 1], arr[j] = arr[j], arr[j - 1] print(arr) 카운팅 정렬 카운트 배열을 만들어, 리스트 안에 존재하는 숫자를 카운트하고 이를 이용하여 정렬 K = 5 # 숫자범위 A = [0, 5, 1, 2, 4, 3, 2, 1] B = [0] * len(A) #카운팅 배열 만들기 cnt = [0] * (K + 1) # 리스트에 해당..

[백준 알고리즘] 8979. 올림픽 _ 파이썬

💻 문제 풀이의 2가지 방법 - 딕셔너리 사용 - 2차원 배열사용 문제에 답이 있다고, 문제 잘 읽으라는 소리를 초등학생부터 들어왔던 것 같은데.. 이 문제가 딱 문제에 해답? 힌트? 가 있는 문제였습니다. 6번째 줄에 자신보다 더 잘한 나라수 + 1 라고 되어있으니, 자신보다 더 잘한 나라수만 체크하면 되겠구나! 라는 아이디어를 문제를 통해 얻었습니다 그리고 조심해야할 부분이자, 처음에 제가 놓쳤던 부분이기도 한데요. - 동메달이 아무리 많아도 1000개가 있어도, 금메달이 1개 있으면 금메달을 가진 나라가 높은 순위라는 것입니다. 즉, 합산으로 풀 수 없고, 금메달부터 봐야 한다는 거죠 (물론, 메달수 의 총합이 1,000,000 이하로 정해져 있기 때문에 가중치를 두어 합산으로 푸는 경우도 있었습니..

[백준 알고리즘] 2847. 게임을 만든 동준이 _ 파이썬

💻 문제 풀이 접근 방법 1) 점수 리스트 만들고 2) for 문 돌려서 다음 숫자의 차이 만큼 감소 3) 계산하는 값 누적하기 🎈 여기서 실수하기 좋은데, 오름차순으로 for문을 돌리며 반례로 레벨 4, 4 5 6 4 가 있습니다. 이럴경우 6만 3으로 바꾸고 for문이 끝나게 되서 틀린 정답이 나옵니다. 그러므로 전체 값을 오름차순으로 만들경우 뒤에서부터 접근해야합니다!! 저도 처음에 이걸 간과했어요ㅠㅠ # 입력받아서 각 레벨별 점수 리스트 만들기 level = int(input()) scores = [0] * level for i in range(level): scores[i] = int(input()) # 점수 차이만큼 빼주고, cnt에 추가해서 세기 cnt = 0 for i in range(le..

[백준 알고리즘] 2804. 크로스워드 만들기 _ 파이썬

💻 문제 풀이 접근 방법 1) A와 B의 공유 글자를 A를 기준으로 찾고 글자와, A의 idx 저장 (공유 글자가 여럿인 경우 A에서 제일 먼저 등장하는 글자가 공유 글자이기 때문) 2) B에서의 공유 글자 위치를 찾고 3) 각각의 idx 값을 이용해 출력 A, B = input().split() # 공유글자 찾기 for i in range(len(A)): if A[i] in B: share = A[i] A_idx = i break # B에서의 공유 글자 위치 찾기 for i in range(len(B)): if B[i] == share: B_idx = i break result = ['.'] * len(A) for i in range(len(B)): result[A_idx] = B[i] if i == ..

[백준 알고리즘] 2953. 나는 요리사다 _ 파이썬

💻 문제풀이 접근 방법 1) 입력받으면서 총점 더하기 2) max, max_idx 값 구해서 출력 별로 어렵지 않은 문제라 금방 풀었지만, 처음 풀었을 때는 코드가 깔끔하게 잘 안 써진다ㅠㅠ 풀고 나서 코드 최적화를 해보면 굳이 적지 않아도 될 필요없는 코드가 보이곤 한다! 반복과 연습만이 길인듯 하다..ㅎㅎ max = 0 max_idx = 0 for i in range(1,6): s = sum(int(x) for x in input().split()) if max < s: max = s max_idx = i print(max_idx, max) www.acmicpc.net/problem/2953 2953번: 나는 요리사다 "나는 요리사다"는 다섯 참가자들이 서로의 요리 실력을 뽐내는 티비 프로이다. 각 ..

[백준 알고리즘] 2851. 슈퍼마리오 _ 파이썬

💻 문제 풀이 접근 방법 1. 합을 쌓아 가다가 2. 100이 넘었을 때 중단시키고 그 앞의 값과 비교 그런데 이렇게 풀었더니, 틀리게 되었습니다ㅠㅠ 바로 100 미만 일 경우를 고려해주지 않았기 때문입니다. 🎈 문제 풀 때 다양한 경우를 함께 고려해주는 것은 정말 기초이면서도 종종 놓치는 경우가 많다. => 문제 제출 전에 오류가 뜰만한 반례를 대입해보자! import sys scores = 0 for _ in range(10): score = int(sys.stdin.readline()) pre_scores = scores scores += score if scores >= 100: if abs(100-scores) > abs(100-pre_scores): scores = pre_scores brea..

[백준 알고리즘] 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] # 정렬시키는 반복문 ..