👉 사용 언어 : PYTHON3
과일장수
✅ Solution
def solution(k, m, score):
answer = 0
sorted_s = sorted(score)
for i in range(len(sorted_s), 0, -m):
if i >= m:
answer += min(sorted_s[i-m:i]) * m
return answer
👉 한 상자 안에서 최저 점수가 갈리기 때문에 최대 이익을 위해서 작은 점수를 가진 사과들끼리, 큰 점수를 가진 사과들끼리 나누어야 한다.
👉 그리고 큰 점수를 가진 사과박스가 많을수록 이득이다.
👉 따라서, score를 정렬 하고 뒤에서부터 m개 씩 슬라이싱 하여 이익을 계산한다.
👉 이 때! i < m 일 경우에는 IndexError가 발생하고 풀이 측면에서도 한 상자를 완성하지 못하는 사과들이므로 필요가 없으니 조건문을 사용하여 제외시킨다.
? 근데 왜 score를 정렬시킨 리스트를 따로 만들지 않고 min(sorted(score)[i-m:i])*m 으로 하면 테스트케이스 채점 시, 대부분이 시간 초과 에러가 나올까 ?
✅ 다른 사람 풀이 참고
def solution(k, m, score):
return sum(sorted(score)[len(score)%m::m])*m
👉 ::m 이 m만큼씩 건너뛰어서 슬라이싱한다는 뜻..
직사각형 별찍기
✅ Solution
a, b = map(int, input().strip().split(' '))
for i in range(0, b):
print('*'*a)
👉 오잉 너무 쉬운 문제를 뽑았다
👉 a, b 변수는 두 정수가 입력(input())으로 들어왔을때 strip()으로 양쪽 사이드 공백을 제거하고 spilt(' ')을 사용하여 공백을 기준으로 두 개의 정수를 분리해준 후, map()을 통해 2개의 정수값을 각각 할당받는다.
✅ strip() / rstrip() / lstrip()
1️⃣ 공백 제거
: 인자에 아무것도 전달하지 않는 경우
: rstrip( ) 또는 lstrip( ) _ 오른쪽 또는 왼쪽 사이드 공백 제거
: strip( ) _ 양쪽 사이드 공백 제거
2️⃣ 동일 문자 제거
: 인자로 문자 1개 전달하는 경우
: 동일하지 않은 문자가 등장할 때까지 동일한 문자 모두 제거
: rstrip( ) 또는 lstrip( ) _ 오른쪽 또는 왼쪽 사이드에서부터 동일 문자 제거
: strip( ) _ 양쪽 사이드에서부터 동일 문자 제거
2️⃣ 여러 문자 제거
: 인자로 문자 여러개 전달하는 경우
: 마찬가지로 동일하지 않은 문자가 등장할 때까지 전달받은 문자와 동일한 문자들 모두 제거
: rstrip( ) 또는 lstrip( ) _ 오른쪽 또는 왼쪽 사이드에서부터 동일 문자들 제거
: strip( ) _ 양쪽 사이드에서부터 동일 문자들 제거
✅ 다른 사람 풀이 참고
a, b = map(int, input().strip().split(' '))
answer = ('*'*a +'\n')*b
print(answer)
👉 반복문 사용하지 않고 줄바꿈 문자('\n')와 *b 연산을 사용하여 나타낼 수도 있다.
핸드폰 번호 가리기
✅ Solution
def solution(phone_number):
answer = ''
answer += ('*'*(len(phone_number)-4) + phone_number[-4::])
return answer
👉 문자열의 곱셈 및 문자열 슬라이싱 사용하여 문제 풀이함.
( index : -4 는 맨뒤에서 4번째 )
👉 풀이 제출하고 다른 사람 풀이 본 순간, answer 문자열과 answer에 추가하는 과정이 불필요하다는 걸 깨달았다.
👉 슬라이싱에서 맨 처음부터이면 [:끝] / 맨 마지막까지이면 [시작:] 처럼 생략 가능하다는 것도 다시 한 번 체크!
( 테스트 케이스 통과 후에도 한 번 더 확인하고 제출하자! )
def solution(phone_number):
return ('*'*(len(phone_number)-4) + phone_number[-4::])
✅ 다른 사람 풀이 참고
def hide_numbers(s):
return "*"*(len(s)-4)+s[-4:]
최소직사각형
✅ Solution
def solution(sizes):
max_list = []
min_list = []
for i in range(len(sizes)):
max_list.append(max(sizes[i]))
min_list.append(min(sizes[i]))
return max(max_list) * max(min_list)
👉 시작전 아이디어 : 배열 안 각 배열을 오름차순 정렬 , 첫 번째 원소 중 max * 두 번째 원소 중 max
👉 실제 구현 : 정렬 후, 각 배열의 첫 번째 원소들, 두 번째 원소들만 모아서 그 중 max를 찾아내는 것이 생각보다 번거로워짐.
그래서 List 2개 를 만들어서 각 배열의 max 만, min 만 분리하여 저장해놓고 2개의 리스트에서 모두 max값 만 추출 해서 곱한 값 을 리턴해주었다.
✅ 다른 사람 풀이 참고
def solution(sizes):
return max(max(x) for x in sizes) * max(min(x) for x in sizes)
👉 구현 방법이나 아이디어는 잘 맞는데 간결하게 (물론 가독성은 기본) 코드로 풀어내는게 부족한 것 같다.
👉 파이썬 내장 함수, 패키지 등과 그것들을 알고리즘을 풀어내는데 있어서 더 잘 응용할 수 있도록 더 많은 문제를 풀어보자.
( 문제 풀이에 대한 아이디어는 그때 그때 정리하도록! )
'알고리즘풀이 > 프로그래머스' 카테고리의 다른 글
| [11/22] Lv1. (2) | 2023.11.18 |
|---|---|
| [11/16] Lv1. (0) | 2023.11.10 |
| [10/31] Lv1. (0) | 2023.11.01 |
| [10/22] Lv1. (0) | 2023.10.19 |
| [9/30] Lv1. (0) | 2023.09.27 |