반응형
▶ 문제1. Summer/Winter Coding(~2018) - 예산
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12982
▶ 풀이
def solution(d, budget):
sum, count = 0, 0
d.sort()
for i in d:
sum += i
if sum <= budget:
count += 1
return count
★ 풀이노트
· 최대한 많은 부서에 예산을 나눠주려면 상대적으로 적은 금액을 신청한 부서를 우선으로 나눠주어야한다.
· line 3 : 그래서 우선 신청 금액을 sort() 함수를 이용하여 정렬해주었다.
· line 1 : budget과 비교하기 위한 신청 금액 총합과 선택된 부서의 수를 변수 sum, count로 선언해주었다.
· line 6 : 반복문을 이용하여 d의 요소를 하나씩 가져오고 변수 sum에 더해준다.
· line 8~9 : 어차피 초기에 정렬을 한 번 해주었기에 sum과 budget을 비교만 해주면 된다.
이때, sum의 값이 budget을 초과한 경우는 제외해야한다.
해당 조건을 만족하는 경우만 선택된 부서가 될 수 있다. 즉, count 변수에 1을 추가해준다.
🧐 풀이를 정리하며...
문제 자체는 금방 이해해서 '아! 이렇게 풀면 되겠다!' 했지만 그게 말처럼 쉽지 않았다...
그냥 한글로 쭉 쓰고 싶은 마음ㅎㅎㅎㅎ
for문의 조건을 이래저래 바꿔도 보고 if문도 바꿔보고 그러다 그냥 코드를 쭉 작성한 후에
한 번 훑어보니 '아 굳이? 이렇게 안 해도 될 것 같은데?' 하면서 고쳐나갔다.
최종 코드 이전에 range(len(d))을 썼었는데 훨씬 깔끔한(아마?) 코드가 완성됐다.
코드 작성할때 중간에 멈춰서 고민하지 말고 우선 필요한 조건들? 부터 쭉 써놓고
코드를 전체적으로 수정해 나가는게 문제를 더 빨리 풀 수 있는 것 같다.
▶ 문제2. 연습문제 - 이상한 문자 만들기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12930#
▶ 풀이
def solution(s):
words = s.split(" ")
new_str = ""
for txt in words:
for i in range(len(txt)):
if i % 2 == 0:
new_str += txt[i].upper()
else:
new_str += txt[i].lower()
new_str += " "
return new_str[:-1]
★ 풀이노트
· line2 : 단어들은 공백 문자로 구분 되기에 split(" ") 기준으로 잘라서 words에 담았다.
· line5 ~ 6 :각 단어의 길이만큼 반복한다.
· line7 ~ 10 : 짝수 인덱스의 경우 대문자, 홀수 인덱스의 경우 소문자로 치환하여 변수 new_str에 더한다.
짝수 : i % 2 == 0 // 홀수 : i % 2 == 1(else의 경우이다.)
대문자 : 문자열.upper() // 소문자 : 문자열.lower()
· line12 : 각 단어마다 " "(공백)을 더해준다.
· line14 : line12에서 마지막 단어의 반복이 끝난 후에도 " "(공백)이 더해지는데 이 공백은 필요없으므로
문자열 슬라이싱을 통해 마지막 앞단어까지 잘라서 반환해준다.
😱 함정 😱
· 각 단어는 하나이상의 공백문자로 구분된다. (앞 뒤?로)
🧐 풀이를 정리하며...
함정 때문에 3트만에 정답을 맞췄다.
처음에 정확성? 68%로 오답이었었다. 그러고 문제를 다시 읽어보는데 뭔가 저 "하나이상의 공백문자로 구분되어있다"는 문장이 수상해 보였다. 그래서 단어 사이 공백이 2개 이상이 있을거라 예상하고 다시 코드를 수정했다.
테스트 케이스가 없어서 뭐 당연히 단어 사이에는 공백 문자 1개만 넣으면 되겠지 하고 filter(None,~)로 공백단어?는 다 제거해주었다. 코드를 수정 후 채점을 했는데 뜨든 ?? 정확성 31%..... 더 낮게 나왔다ㅠㅠ
그럼 공백문자는 몇개든 포함하면 되겠구나 근데 그 사이에 구분을 위한 공백은 있어야겠구나 했다. 그리고 원래 .rstrip()을 넣어줬었는데 이걸 넣으면 마지막 단어 뒤에 공백문자도 다 제거가 되니까 슬라이싱으로 대체 해주니 정답!! (혹시 마지막 단어 뒤에 공백을 넣었을 수도 있으니 ㅎ)
▶ 문제3. 연습문제 - 삼총사
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131705
▶ 풀이
from itertools import combinations
def solution(numbers):
count = 0
trios = list(combinations(numbers, 3))
for trio in trios:
if sum(trio) == 0:
count += 1
return count
★ 풀이노트
· 일단 학생을 3명씩 조합을 해야하는데 몇 가지 고려사항이 있었다.
1. 한 조합에서 한 학생이 2번 이상 나올 순 없다.
2. 조합이 중복되어선 안 된다. 예) (학생1, 학생2, 학생3), (학생2, 학생3, 학생1), ...
· line1 : 우선 중복을 허용하지 않는 조합을 하기 위해서 itertools.combitations 모듈을 사용하였다.
· line4 : 조건에 만족하는 횟수를 구하기 위해 변수 count를 선언하였다.
· line5 : combinations 함수를 이용하여 입력받은 numbers에서 3개씩 조합을 만들었다.
이때, 중복은 허용되지 않는다. 각 조합들은 튜플 형식으로 반환된다. (), (), ...
전체 조합들을 list로 만들어서 변수 trios에 담았다. [(), (), (),...]
· line7~9 : 반복문을 통해 각 조합을 뽑아서 튜플 내부의 요소들을 합해준다.
합한 값이 0과 같을 경우 변수 count에 1을 더 해준다.
· line11 : 최종적으로 조합의 값이 0이 되는 횟수 즉, count 변수를 반환해 준다.
🧐 풀이를 정리하며...
웬만하면 모듈을 사용하지 않고 for문으로 풀어보려고 했다.
3중 for문 만들어서 돌려봤는데 중복 처리 하는 방법을 어떻게 해야할지.....
노트 펴서 실제로 경우의 수들을 끄적이면서 해봤는데도 잘 모르겠다.
우선 모듈 사용해서 문제 풀고 다른 사람들 풀이 보니까 역시나 3중 for문으로 푸신 분들이 계셨다.
모듈 사용해서 푼 분들 보다 더 많았던 것 같은데... 봐도 모르겠더라ㅠㅠ
chatGPT한테 헬프를 했는데 아직 이해가 안 간다. 내일 다시 풀어봐야징
그리고 오늘 멘토링 하면서 시간복잡도에 대해서 알게 되었는데 생각보다 심오?했다.
단어 그대로 아주 복잡했닿ㅎㅎ 멘토님께서 참조링크를 달아주셔서 맛보기로 읽어봤는데 이 때 뇌가 멈췄던것 같닼ㅋㅋㅋ
코테하면서도 시간복잡도, 공간복잡도에 대해서 질문을 많이 하신다고 했다.
아 그래서 chatGPT한테 이 문제에 대해서 물어보면서 모듈사용했을때랑 for문으로 했을 때 시간복잡도를 비교해 달라고 했는데
모듈로 푸는게 시간복잡도면에서는 효율적이었다.
근데 실제 코테할 때 모듈이나 그런거 불러와서 풀어도 되는걸까? 시간복잡도면에서는 좋진 않지만 그래도 for문으로 푸는걸 이해해보도록 해야겠다.
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Lv.0-C] 원하는 문자열 찾기 (1) | 2025.06.10 |
---|---|
[기초 Lv.0-Python] 코딩 기초 트레이닝 Day4 - 연산, 조건문 (0) | 2025.02.10 |
[기초 Lv.0-Python] 코딩 기초 트레이닝 Day3 - 연산 (0) | 2025.02.08 |
[기초 Lv.0-Python] 코딩 기초 트레이닝 Day2 - 출력, 연산 (0) | 2025.02.07 |
[기초 Lv.0-Python] 코딩 기초 트레이닝 Day1 - 출력 (0) | 2025.02.06 |
댓글