[프로그래머스] lv0. 배열의 평균값, 배열 원소의 길이, 배열 뒤집기, 문자열 뒤집기, 머쓱이보다 키 큰 사람, 배열 자르기, 배열 두 배 만들기, 배열 회전시키기, 배열의 유사도

주연·2023년 1월 27일
0

Python 문제 풀이

목록 보기
13/20
post-thumbnail

배열의 평균값

230127

문제

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

제한사항
0 ≤ numbers의 원소 ≤ 1,000
1 ≤ numbers의 길이 ≤ 100
정답의 소수 부분이 .0 또는 .5인 경우만 입력으로 주어집니다.

입출력 예

numbersresult
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]5.5
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]94.0

풀이

import numpy as np

def solution(numbers):
    return np.mean(numbers)

배열 원소의 길이

230127

문제

문제 설명
문자열 배열 strlist가 매개변수로 주어집니다. strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ strlist 원소의 길이 ≤ 100
strlist는 알파벳 소문자, 대문자, 특수문자로 구성되어 있습니다.

입출력 예

strlistresult
["We", "are", "the", "world!"][2, 3, 3, 6]
["I", "Love", "Programmers."][1, 4, 12]

풀이

def solution(strlist):
    answer = []
    for i in range(0,len(strlist)):
        answer.append(len(strlist[i]))
    return answer

ㅎ..

  • 다른 사람 풀이
#1
def solution(strlist):
    answer = list(map(len, strlist))
    return answer
    
#2
def solution(strlist):
    answer =[]
    for i in strlist:
        answer.append(len(i))
    return answer
    
#3
def solution(strlist):
    return [len(str) for str in strlist]

#1) 아하 for문대신 map을 이용하면 되구나
배열의 모든 요소를 변환시키기 위해서는 앞으로 map을 써봐야겠다.

#2), #3) 내가 푼 방법에서 조금 개선된 방법이라고 생각한다. 이런 식으로 쓰도록 해봐야겠다.

배열 뒤집기

230127

문제

문제 설명
정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ num_list의 길이 ≤ 1,000
0 ≤ num_list의 원소 ≤ 1,000

풀이

def solution(num_list):
    return list(reversed(num_list))
  • 다른 사람 풀이
#1
def solution(num_list):
    return num_list[::-1]

#2 reverse
def solution(num_list):
    num_list.reverse()
    return num_list

#1) 이야..간단하다..인덱스 호출로 문자열 순서 바꾸는 거 좋다
이걸로 기억하고 있어야겠다.

문자열 뒤집기

230127

문제

문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ my_string의 길이 ≤ 1,000

풀이

def solution(my_string):
    return my_string[::-1]

이야 말하기가 무섭게 바로 또 뒤집기다. 아주 좋은 방법이다.

머쓱이보다 키 큰 사람

230129

문제

문제 설명
머쓱이는 학교에서 키 순으로 줄을 설 때 몇 번째로 서야 하는지 궁금해졌습니다. 머쓱이네 반 친구들의 키가 담긴 정수 배열 array와 머쓱이의 키 height가 매개변수로 주어질 때, 머쓱이보다 키 큰 사람 수를 return 하도록 solution 함수를 완성해보세요.

제한사항
1 ≤ array의 길이 ≤ 100
1 ≤ height ≤ 200
1 ≤ array의 원소 ≤ 200

입출력 예

arrayheightresult
[149, 180, 192, 170]1673
[180, 120, 140]1900

풀이

def solution(array, height):
    return len([*filter(lambda x: x > height, array)])
	#return len(list(filter(lambda x: x >= height, array)))

어떻게 하면 효율적으로 풀 수 있을까 고민하다가 생각한 것은 filter였고
filter 첫 번째 매개변수에 함수를 넣어야하는데 정의하는 건 오히려 복잡해진다고 생각했다. 그러다 발견하게 된 것이 lambda였다.
[*]는 구글링하다 알게 되었고 python에서의 *은 정말 기능이 다양하게 쓰인다는 것을 알게 되었다.
그 중 unpacking 역할을 함을 알 수 있었다.

[*]를 써서 list 형태로 만들어 주었다. 물론 주석에 적은 것처럼 써도 된다.

(* 참조: https://velog.io/@insutance/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B3%84%ED%91%9C-Asterisk-%EC%9D%98-%EC%97%AD%ED%95%A0)

filter와 rambda + isinstance

arr = [1, 2, 3, 4.5, 3.2]

#isinstance: 타입 확인

print(list(filter(lambda x: isinstance(x, int), arr)))
#결과: [1, 2, 3]

print(list(filter(lambda x: isinstance(x, float), arr)))
#결과: [4.5, 3.2]
  • 다른 사람 풀이
#배열 안에 넣어서 푼 풀이
def solution(array, height):
    array.append(height)
    array.sort(reverse=True)
    return array.index(height)

배열 자르기

230129

문제

문제 설명
정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

제한사항
2 ≤ numbers의 길이 ≤ 30
0 ≤ numbers의 원소 ≤ 1,000
0 ≤num1 < num2 < numbers의 길이

입출력 예

numbersnum1num2result
[1, 2, 3, 4, 5]13[2, 3, 4]
[1, 3, 5]12[3, 5]

풀이

def solution(numbers, num1, num2):
    return numbers[num1:num2+1]

배열 두 배 만들기

230129

문제

문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.

제한사항
-10,000 ≤ numbers의 원소 ≤ 10,000
1 ≤ numbers의 길이 ≤ 1,000

풀이

def solution(numbers):
    return list(map(lambda x: x*2 ,numbers))

배열 원소의 길이 풀 때 봤던 것을 사용해봤다.

  • 다른 사람 풀이
def solution(numbers):
    return [num*2 for num in numbers]

이것도 배열 원소의 길이 풀 때 봤던 거다! 다음엔 이걸 사용해봐야겠다.

배열 회전시키기

230130

문제

문제 설명
정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

제한사항
3 ≤ numbers의 길이 ≤ 20
direction은 "left" 와 "right" 둘 중 하나입니다.

입출력 예

numbersdirectionresult
[1, 2, 3]"right"[3, 1, 2]
[4, 455, 6, 4, -1, 45, 6]"left"[455, 6, 4, -1, 45, 6, 4]

풀이

def solution(numbers, direction):
    right = numbers[-1]
    left = numbers[0]
    
    if direction == "right":
        numbers.remove(right)
        numbers.insert(0, right)
    else:
        numbers.remove(left)
        numbers.append(left)
        
    return numbers

ㅎ...핫

  • 다른 사람 풀이
from collections import deque

def solution(numbers, direction):
    numbers = deque(numbers)
    numbers.rotate(1 if direction == 'right' else -1)
    return list(numbers)

와 왜 문제푸는 동안 rotate 아무도 안 알려줬지?

deque이용해 리스트 회전

from collections import deque를 통해 모듈을 불러오고
deque()로 자료형바꾸고 rotate()함수를 이용하면 회전된다.
함수안에 음수를 넣으면 왼쪽을 회전하고
양수를 넣으면 오른쪽으로 회전한다.
숫자가 1이면 한 번 회전 2이면 두 번 회전한다.

배열의 유사도

230207

문제

문제 설명
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ s1, s2의 길이 ≤ 100
1 ≤ s1, s2의 원소의 길이 ≤ 10
s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
s1과 s2는 각각 중복된 원소를 갖지 않습니다.

입출력 예

s1s2result
["a", "b", "c"]["com", "b", "d", "p", "c"]2
["n", "omg"]["m", "dot"]0

풀이

def solution(s1, s2):
    count = 0
    for i in s1:
        for j in s2:
            if i == j:
                count += 1
    return count

이렇게 했다가

def solution(s1, s2):
    return sum(1 for i in s1 for j in s2 if i == j)

이렇게 고쳤다. 사실 그게 그거긴 해

  • 다른 사람 풀이
def solution(s1, s2):
    return len(set(s1)&set(s2));

뭔데
set이용해서 푸는 거 처음봤다.
각각을 set을 이용해 {}형태로 한 후 교집합을 하여 겹치는 원소를 구한다.
이후 len함수를 통해 개수를 구해줘 배열의 유사도를 구할 수 있다!

여기서는 중복과 관련이 없어서 set을 이용할 수 있었는데 만약 s2에 s1에 있는 중복된 값이 하나 더 있었다면? 이건 이용할 수 없겠지

set 함수

set은 Python 내장 함수이며 중복되지 않은 원소(unique)를 갖기 위해 사용된다.

set은 연산자를 활용할 수 있는데,
합집합: |
교집합: &
차집합: -
대칭차집합(합집합 - 교집합): ^
(참고: https://aigong.tistory.com/30)

profile
공부 기록

0개의 댓글