파이썬 160

[백준, 파이썬, 1059번] 좋은 구간

풀이 처음에는 해당 문제에 대한 이해가 되질 않았다... 역시 알고리즘은 계속 풀면서 문제 이해하는 능력을 키워야하는 것 같다... 무튼 해당 문제에선 주어지는 집합 S에 해당하는 구간에 n을 포함하는 좋은 구간의 개수를 구하는 것으로 S = [4,8,13,24,30], n = 10 의 경우엔 8과 13 사이에 10이 속하기에 해당 구간에서 8과 13이 포함되지 않은 9와 12 사이에서 찾는것인데 처음엔 여기서 막혔다. 이유는 그러면 [ [9,10], [9,11], [9,12], [10,11], [10,12], [11,12]] 이렇게 되는거 아닌가? 그러다 문제에서 n을 포함하는 좋은 구간의 개수를 구해보자. 라는 말을 확인하게 되어 이해할 수 있었다. 이후 나머지는 간단한 연산 문제이기에 쉽게 해결되었..

알고리즘 2023.12.21

[백준, 파이썬, 1051번] 숫자 정사각형

풀이 3중 for문을 사용해서 문제를 해결하고자 했으며 n은 범위, m은 가로, x는 n 범위에 따른 세로로 생각하여 문제를 해결하고자 했으며 try, except를 사용한 이유는 mtx의 범위를 벗어날 경우에 break를 걸기위해 사용 그리고 더 빠른 제출을 위한 조건분기로는 큰 범위부터 찾는 것, 찾았다면 해당 for문 멈추기와 같은 것들이 있지만 그렇게까지는 하지 않아도 될 것 같아 그냥 제출 import sys input = sys.stdin.readline n,m = map(int,input().split()) mtx = [list(map(int,input().rstrip("\n"))) for _ in range(n)] result = 0 for i in range(n): for j in ran..

알고리즘 2023.12.20

[백준, 파이썬, 1021번] 회전하는 큐

풀이 뭔가 애를 먹었던 부분이 else의 if 문에서 인덱스와 dq.size()/2 부분에서 정수 나누기 정수의 경우엔 정수로 되는 부분으로 한참 고생을 했다. 마지막으로 문제에서 2번,3번 연산의 최솟값을 출력하라고 해서 둘 중 작은 값으로 출력해야하는 줄 알고도 조금 ... ㅎ import sys from collections import deque input = sys.stdin.readline cnt = 0 n,m = map(int,input().split()) dq = deque(range(1,n+1)) for i in list(map(int,input().split())): while True: if i == dq[0]: dq.popleft() break else: if dq.index(i)

알고리즘 2023.12.19

[백준, 파이썬, 1049번] 기타줄

풀이 우선 6개 통 구매 가격, 낱개 구매 가격에 대한 배열 생성 후 값 변경한 다음 정렬 이후 낱개 6개와 6개 통 구매의 금액 비교로 조건 분기를 하며 통 구매가 더 적은 경우엔 m을 6으로 나눈 몫 만큼만 통으로 구매한 다음 나머지 개수를 낱개의 값으로 곱한것이 통으로 구매한 가격보다 큰지에 대한 조건분기 처리를 한 번 더 하여 문제 해결 import sys input = sys.stdin.readline m,n = map(int,input().split()) f_li, li = [0]*n, [0]*n result = 0 for i in range(n): x,y = map(int,input().split()) f_li[i], li[i] = x, y f_li.sort() li.sort() if li[..

알고리즘 2023.12.18

[백준, 파이썬, 1159번] 농구 경기

풀이 입력값의 첫 글자에 대한 key 값이 map에 있다면 해당 key값의 value를 ++ 해주며 그 값이 5가 되었을 경우엔 state 변경과 li에 추가 key가 없다면 추가 후 1로 초기화 이후 state가 true의 경우 li를 정렬 후 출력 없다면 의도하는 문구 출력 import sys input = sys.stdin.readline N,m,M,T,R = map(int,input().split()) be_m = m cnt = 0 if M-m >= T: # 추가 혈압이 초과 되지 않는 범위 for _ in range(N): if m+T M): cnt += 1 if m-R >= be_m: m -= R else: m = be_m break m += T cnt += 1 print(cnt) else: ..

알고리즘 2023.12.13

[백준, 파이썬, 1173번] 운동

풀이 조건식을 통해 최대 혈압 - 최소 혈압의 차이가 T를 넘을 경우 -1 출력하도록 하기 넘지 않고 최소 혈압에 운동 후의 추가 혈압이 최대를 넘지 않을 경우와 넘을 경우에 대한 조건 분기를 하며 넘을 경우에는 다시 운동할 수 있는 혈압이 될때까지 while문을 반복한 다음 운동한 뒤 카운팅하여 문제 해결 import sys input = sys.stdin.readline N,m,M,T,R = map(int,input().split()) be_m = m cnt = 0 if M-m >= T: # 추가 혈압이 초과 되지 않는 범위 for _ in range(N): if m+T M): cnt += 1 if m-R >= be_m: m -= R else: m = be_m break m += T cnt += 1 ..

알고리즘 2023.12.13

[백준, 파이썬, 25206번] 너의 평점은

풀이 우선 과목 평점에 대한 값을 딕셔너리 타입으로 정리한 뒤 subject에 입력값을 받은 다음 하나씩 조회를 했는데 문제에서 P의 경우에는 점수를 반영하지 않는다고 했기에 continue를 사용 이외에는 우선 hap1에는 전공과목별의 누적합을 계산하고 hap2에는 학점의 합을 누적합을 계산하여 최종적으로 나눈 값을 round로 6자리까지 보여주도록하며 반올림하도록 하여 해결 다만 여기서 0을 나눈 값에 대한 에러 또는 0.0으로 표기되는 것에 대한 조건을 하나 더 추가하여 문제를 해결. import sys input = sys.stdin.readline hap1,hap2 = 0.0,0.0 _dic = {'A+': 4.5, 'A0': 4.0, 'B+': 3.5, 'B0': 3.0, 'C+': 2.5, ..

알고리즘 2023.10.11

[백준, 파이썬, 10988번] 팰린드롬인지 확인하기

풀이 팰린드롬은 좌우대칭으로하여 같은 문자인지 체크했을 때 다르면 바로 팰린드롬이 아닌 것으로 체크하고 끝까지 같다면 팰린드롬으로 결과를 내게 되어 아래 코드와 같이 문자 길이의 반만큼 반복하여 조건식을 활용해 문제 해결 import sys input = sys.stdin.readline s = input().rstrip('\n') ln = len(s) result = 1 for i in range(ln//2): if s[i] != s[ln-1-i]: result = 0 break print(result)

알고리즘 2023.10.11

[백준, 파이썬, 1075번] 나누기

풀이 단순히 n으로 받아오는 값에서 뒤 두 수를 00으로 변환한 뒤 뒤에서 세 번째 자리의 값이 바뀌기 전까지 수를 1 증가 한 값이 f로 나누어 떨어지면 뒤 두 수를 출력하면 되는 문제이기에 아래와 같이 해결 import sys input = sys.stdin.readline n,f = input().rstrip('\n'),int(input().rstrip('\n')) for i in range(int(n[:-2]+'00'),int(n[:-2]+'99')+2): if not i%f: print(str(i)[-2:]) break

알고리즘 2023.10.09

[백준, 파이썬, 3273번] 두 수의 합

풀이 처음 접근한 방법은 조합을 활용한 방법으로 아래 메모리 초과 코드로서 문제가 의도한 접근 방법이 아니였다.. 이후 접근한 다른 방법으로는 아래 시간 초과 코드 li를 오름차순 정렬 후 2중 for 문을 활용해서 이전 값과는 비교하지 않는 형식으로 시간과 메모리를 줄여봤지만 여전히 시간초과... 그래서 마지막으로 해당 시간을 줄이기 위해 이분 탐색을 적용해서 풀어본 결과 무사히 제출이 되었다. 이분 탐색 코드는 거의 똑같다고 보면 되기에 설명은 생략함. 정답 코드 import sys input = sys.stdin.readline n = int(input()) li = sorted(list(map(int,input().rstrip('\n').split()))) x = int(input()) resul..

알고리즘 2023.10.07