본문 바로가기

알고리즘풀이/프로그래머스

[11/8] Lv1.

👉 사용 언어 : 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