🧩 문제 : 2022 사다리 👩🏻💻 문제 정리 x, y, c가 주어졌을 때 ?를 구하면 되는 문제 ! x : 왼쪽 빌딩 위 - 오른쪽 빌딩 아래에 놓인 사다리의 길이 y : 왼쪽 빌딩 아래 - 오른쪽 빌딩 위에 놓인 사다리의 길이 c : 두 사다리가 교차하는 지점 ? : 두 빌딩 사이의 거리 💪🏻 풀이 과정 1️⃣ w와 c의 관계를 나타내는 식 구하기 다음과 같이 x, y, c, w에 대하여 c에 대한 식을 유도해냈다. # c를 구하는 함수 def f(w): h1 = (x ** 2 - w ** 2) ** 0.5 h2 = (y ** 2 - w ** 2) ** 0.5 c = (h1 * h2) / (h1 + h2) return c 해당 식을 만족하는 w 값을 탐색하면 된다. ❓ w값 탐색 범위는? 1. x..
🧩 문제 : 3107 IPv6 👩🏻💻 문제 정리 ! 해당 규칙을 토대로 축약된 IPv6 주소를 축약되기 전의 형태로 바꾸어 출력하는 문제 ! 💪🏻 풀이 과정 📍 해결 방법 1. 입력받은 문자열을 ':'으로 split하여 저장한다. 1-1 ) 맨 앞과 맨 뒤에 ::가 있던 경우 ''가 두 개이상 저장되므로 이를 방지하기 위해 if문으로 처리해주었다. 2. 그룹의 개수인 8만큼 반복문을 수행한다. 2-1) 리스트 속 문자열이 ''이라면 ''를 지우고 IPv6의 length가 8이 될 때까지 '0000'으로 채운다. 2-2) 빈 문자열이 아닌데 그룹의 길이가 4가 아니라면 zfill 함수를 통해 0으로 채워준다. 3. 형식에 맞게 출력 ! 💻 전체 코드 import sys # 입력 IPv6 = list(ma..
🧩 문제 : 25603 짱해커 이동식 👩🏻💻 문제 정리 1. 짱해커 이동식은 비용이 적게 드는 의뢰를 받으려 한다. 2. 그런데 K번 이상 거절은 불가능하다. -> 임의의 연속된 K개의 의뢰 중 하나는 꼭 받아야 한다. 3. 이동식이 수락한 의뢰들이 가진 비용 중 가장 높은 비용을 구하면 된다. 💪🏻 풀이 과정 1️⃣ 첫번째 - 시간 초과 import sys input = sys.stdin.readline N, K = map(int, input().split()) # N : 의뢰 개수, K : 연속으로 거절할 수 있는 최대 횟수 data = list(map(int, input().split())) # 의뢰 리스트 min_cost = 10**9 answer = 0 for i in range(N): ans..
🧩 문제 : K번째 수 👩🏻💻 문제 정리 1. 입력값 array를 i번째 숫자부터 j번째 숫자까지로 자르고 정렬한다. 2. 자른 array에서 k번째 숫자를 구한다. 엄청 간단하다 ! 💪🏻 해결 방법 주의할 점은 array의 index 번호와 문제에서 이야기하는 ?번째 수가 다르다는 것 정도 ! 1️⃣ 첫번째 성공 🥳 def solution(array, commands): answer = [] for command in commands: # i, j, k 꺼내기 k = command.pop() j = command.pop() i = command.pop() _array = [] # i ~ j번째 숫자를 담을 배열 for index in range(i, j + 1): print(index) _array...
🧩 문제 : 체육복 👩🏻💻 문제 정리 💪🏻 해결 방법 그리디 알고리즘을 이용하자 ! 문제에는 다음과 같은 제한사항이 존재합니다. 체육복을 빌려줄 수 있는 학생에 속하더라도, 도난당할 수 있습니다. -> 여분 체육복을 도난 당한 경우에는 체육복을 빌려줄 수 없습니다. 따라서 저는 체육복을 빌려준다했는데 도난 당한 학생을 입력값인 lost와 reserve 에서 제외하고 빌려줄 수 있는 학생의 번호 앞뒤로 체육복을 도난 당한 학생이 존재한다면 new_lost에서 remove 시키면서 ( 체육복을 앞 번호에게 빌려 주었다면 뒷 번호에게는 빌려줄 수 없게하기 위해 remove ) 마지막에 전체 학생 명수에서 new_lost의 길이를 뺀 값을 return 시키는 방식으로 문제에 접근했습니다. 1️⃣ 첫번째 - 틀..
문제 : 1107번 💪🏻 해결 방법 N의 최대 범위가 500,000이라 500,000까지만 탐색하면 된다고 생각했는데 다른 풀이를 참고해보니 range를 1,000,000으로 두고 풀고 있었다. range를 1,000,000으로 설정한 이유는 0번부터 ++로 이동하는 경우와, 거꾸로 999,999번부터 --로 이동하는 경우를 전부 고려하기 위함이었다. * 9빼고 모든 버튼이 고장났다면 9밖에 누를 수 없음 정답 코드 target = int(input()) ans = abs(100 - target) # + , - 버튼으로 하나하나 이동하는 경우 M = int(input()) if M: broken = set(input().split()) else: broken = set() for num in range(..