PS/백준 130

[Python] 1969번 DNA

✏️ 문제 문제 파악제일 중요한 건 이런 식으로 같은 index에 있는 문자끼리 묶어서 그 열에서 제일 많이 사용되는 문자를 s에 추가하는 것이 포인트이다.제일 많은 사용되는 문자가 문자열과 비교해서 다르면 Hamming Distance += 1 하는 식으로 코드를 짜면 쉽게 풀 수 있다.문자열에서 가장 많이 나오는 문자를 가져오기 위해선 collections.Counter를 사용하면 된다. 알고리즘그리디 알고리즘구현문자열브루트포스 알고리즘  코드from collections import Countern, m = map(int, input().split())hamming = 0ary = []char_ary = [[] for _ in range(m)] for i in range(n): ary.append..

PS/백준 2024.07.19

[Python] 2828번 사과 담기 게임

✏️ 문제 문제 파악처음에는 현재 위치를 기준으로 현재 위치가 중간에 있으면 앞뒤로 (현재위치-길이/2)부터 (현재위치+길이/2)까지 사과가 떨어지는 위치에 해당되면 거리를 더하지 않고 해당되지 않으면 거리를 더하고 이런 방식으로 코드를 짜려고 했다.  근데 하다보니 복잡하고 경우의 수가 너무 많은 것 같아서 결국 포기.. 바구니의 왼쪽 위치와 오른쪽 위치를 저장해두고바구니의 왼쪽 위치보다 사과의 위치가 작으면 이동거리 = (바구니의 왼쪽 위치 - 사과의 위치)바구니의 오른쪽 위치보다 사과의 위치가 크면 이동거리 = (사과의 위치 - 바구니의 오른쪽 위치)그 외의 경우는 가만히 있어도 바구니 위치에 사과의 위치가 해당 (들어옴)라고 푸는 게 훨 편했다.. 알고리즘그리디 알고리즘구현  코드n,m = map..

PS/백준 2024.07.19

[Python] 19941번 햄버거 분배

✏️ 문제 문제 파악일단 'H'를 기준, 경우의 수를 3가지로 나눴다.H의 위치가 K보다 작을 경우: H를 기준으로 좌로 K만큼 비교할 때 배열 범위를 벗어난다.H의 위치가 K보다 크고 N-K보다 작을 경우: H를 기준으로 좌우로 K만큼 비교할 수 있다.H의 위치가 N-K 크거나 같을 경우: H를 기준으로 우로 K만큼 비교할 때 배열 범위를 벗어난다.이때  i-k가 0보다 작으면, i+k가 n보다 크면 배열 범위를 벗어나므로 처리를 해주어야 한다! 알고리즘그리디 알고리즘  코드n, k = map(int, input().split())ary = list(map(str, input()))start = 0end = 0for i in range(len(ary)): if ary[i] == 'H': if ..

PS/백준 2024.07.19

[Python] 2012번 등수 매기기

✏️ 문제 문제 파악문제 그대로 불만도를 최소를 하기 위해선 본인이 원하는 등수와 많이 차이나면 안되므로 차례대로 정렬해준다.그 후 예상 등수와 실제 등수를 빼서 절댓값을 불만도에 더해주면 된다. 이때 그냥 input()을 쓴 상태로 하면 시간 초과가 뜨므로 sys input()을 쓰든가 언어를 python3 대신 pypy3를 쓰면 같은 코드라도 통과된다!! 알고리즘그리디 알고리즘정렬  코드import sysinput = sys.stdin.readlinen = int(input())ary = []dis = 0for i in range(n): ary.append(int(input()))ary.sort()for i in range(n): if ary[i] != i+1: dis += abs(ary[i..

PS/백준 2024.07.19

[Python] 15904번 UCPC는 무엇의 약자일까?

✏️ 문제 문제 파악보자마자 아 그냥 find랑 rfind 써서 인덱스로 비교하면 되겠구나 했는데 결국 풀지 못했다.질문 게시판에 있는 모든 반례UCPCCUCPPCUUCPCCUCPCUPCPC를 적용해봤을 때 다 잘 나왔는데 .. 그래서 주어진 문장이 "UPCP" 문자열의 index로 비교하여 차례대로 나오는 지 확인하는 방법으로 풀었다. 알고리즘그리디 알고리즘문자열  코드실패한 코드 - 반례 좀 찾아주세요 .. s = input()c_index = -1p_index = -1for i, char in enumerate(s): if char == 'P' and i 성공 코드s = input()target = "UCPC"index = 0for char in s: if char == target[idx]..

PS/백준 2024.07.19

[Python] 16435번 스네이크버드

✏️ 문제 문제 파악배열을 정렬하면 쉽게 풀 수 있는 문제이다. 과일의 높이를 넣은 배열을 정렬한 후에 과일의 높이와 스네이크버드의 길이가 같으면 먹을 수 있기 때문에 길이 += 1 하고 아니면 break 해서 스네이크버드의 길이를 출력하는 방향으로 코드를 짰다. 알고리즘그리디 알고리즘정렬  코드n, l = map(int, input().split())apple = list(map(int, input().split()))apple.sort()for i in range(len(apple)): if apple[i] > l: break else: l += 1print(l)

PS/백준 2024.07.17

[Python] 1417번 국회의원 선거

✏️ 문제 문제 파악득표수 배열을 A로 가정하자. 처음엔 if max(A) > A[0] 이라는 조건문이 true면 최댓값을 가지고 있는 후보의 득표수를 -1 하고 A[0]에 득표수 +1, 매수해야 하는 사람수 +1 하는 방향으로 코드를 짰다.이렇게 짜니 무한루프를 돌고 있었고 생각해보니 다솜이가 원하는 A[0]이 배열의 최댓값이 되면 A[0]의 값이 계속 -1, +1, -1, +1 을 반복하게 되기 때문이었다. 그래서 max(A) == A[0] 라는 조건문을 사용하여 코드를 새로 짜니 해결되었다.또한 최대 득표수를 가지고 있는 후보에 A[0]가 있으면서 (and) 여러 후보라면 1명만 매수하면 되므로 매수해야 하는 사람을 +1 해주었다. 알고리즘그리디 알고리즘구현자료 구조시뮬레이션우선순위 큐  코드n =..

PS/백준 2024.07.17

[Python] 2847번 게임을 만든 동준이

✏️ 문제 문제 파악마지막에 오는 점수가 제일 큰 점수가 되어야 하므로 배열을 끝에서부터 훑으며 마지막 점수를 기준으로 앞에 있는 점수들을 바로 뒤에 있는 점수보다 1점 더 작은 점수로 감소하는 방향으로 코드를 짰다. 알고리즘그리디 알고리즘  코드n = int(input())de = 0score = []for i in range(n): score.append(int(input()))for i in range(n-1, 0, -1): # 뒤에서부터 읽어오기 if score[i-1] - score[i] > 0: # 크면 바로 뒤에 있는 점수보다 1점 작은 점수가 되도록 조정 de += (score[i-1] - score[i] + 1) score[i-1] = score[i] - 1 elif..

PS/백준 2024.07.16

[Python] 1213번 팰린드롬 만들기

✏️ 문제 문제 파악일단 팰린드롬이 되려면 모든 알파벳이 짝수 개일 때하나의 알파벳만 홀수 개고 나머지는 짝수 개일 때위의 조건이 성립하지 않으면 "sorry ~" 출력   알고리즘그리디 알고리즘구현문자열  코드name = input() count = {}keys = sorted(list(set(name)))odd = []result = ''for key in keys: cnt = name.count(key) count[key] = cnt if cnt % 2 != 0: odd.append(key)if len(odd) > 1: print("I'm Sorry Hansoo")else: for key in keys: result += key * (count[key] // 2) if odd ..

PS/백준 2024.07.16

[Python] 14916번 거스름돈

✏️ 문제 문제 파악이거 설탕 배달이랑 똑같은 알고리즘이다. 보자마자 설탕 배달 생각남..최소 개수를 출력해야 되므로 큰 단위인 5원부터 비교하지만 5원보다 크다고 무조건 5원으로 나누도록 코드를 짜지 않는 게 포인트이다.  예제1의 경우 5원으로 나누게 되면 5원 2개가 나오고 나머지가 3이므로 거슬러 줄 수 없다고 나올 수 있기 때문이다. 이 점을 잘 생각하여 코드를 작성해야 한다. 알고리즘그리디 알고리즘다이나믹 프로그래밍수학  코드n = int(input())count = 0while n >= 0: if n % 5 == 0: # 5원으로 나눴을 때 나머지가 없는 경우에만 5원으로 나눔! count += int(n // 5) print(count) break n -= 2 ..

PS/백준 2024.07.16