개발일기

#3. 프로그래머스 알고리즘 정리본 본문

오류 및 알고리즘정리본

#3. 프로그래머스 알고리즘 정리본

츄98 2023. 4. 4. 20:53

오늘 총 15문제 풀었음.

오늘도 어김없이, 이 중 기억에 남는 알고리즘 풀이들을 정리해보자.

 

1. 이차원 배열 문제:

1 2 3
4 5 6
7 8 9
이차원 배열을 선언한 뒤 위와 동일하게 출력하기
# 나의 풀이
list = [[1,2,3],[4,5,6],[7,8,9]]
for i in list:
    for j in i:
        print(j, end=' ') #출력할 때 숫자 사이에 띄어쓰기하기
    print()
    
    
# 인상깊은 다른 풀이 (언패킹)
for i in list:
     print(*i)

언패킹.. 알고있는데, 왜 쓰질 못하니~~ㅠㅠㅠ

 

 

2. 배열 원소의 길이

ex) list = ['apple', 'love']이면 원소의 길이는 [5, 4]로 출력

# 내풀이
def solution(strlist):
     index = 0
     for i in strlist:
         strlist[index] = len(i)
         index += 1
     return strlist
     
# 내풀이를 최적화 하면??
def solution(strlist):
     return [len(i) for i in strlist]
     
# 다른 사람 풀이
def solution(strlist):
     answer = list(map(len, strlist))
     return answer

map을 쓰다닝..!! 하나 더 배워간다!!!

map 사용법..!

map(function, iterable)   
# map(변환함수, 순회 가능한 데이터 like 리스트, 튜플)


map() 함수는 데이터가 담고 있는 모든 데이터를 변환함수에 적용하여 map 타입으로 return한다.

map 타입으로 return하기 때문에, 리스트 타입을 원한다면, list() 를 사용해서 리스트로 타입을 바꿔주어야 한다.

 

 

3. 배열의 유사도 :

문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록

# 내풀이
def solution(s1, s2):
     answer = 0
     for i in s1:
         if i in s2:
             answer += 1
     return answer
     
# 다른 사람 풀이
def solution(s1, s2):
     return len(set(s1)&set(s2));

내 시간복잡도는 O(n^2)이지만.. 교집합으로 풀면 시간복잡도가 O(1)이다..ㅎㅎㅎ

교집합 생각하지도 못했는데, 하나 더 배워간다.

 

 

4. 문자 반복 출력:

문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string에 들어있는 각 문자를 n만큼 반복한 문자열을 return 하도록

# 내 풀이
def solution(my_string, n):
     my_string_list = []
     for string in my_string:
         my_string_list.append(string*n)
     return ''.join(my_string_list)

# 다른 사람 풀이
def solution(my_string, n):
    return ''.join(i*n for i in my_string)

def solution(my_string, n):
    answer = ''
    for c in list(my_string):
        answer += c*n
    return answer

나는 이 문제를 빈 리스트에 반복된 문자를 append하고 join으로 문자열을 출력했는데,

다른 사람의 풀이를 보니 굳이 빈리스트가 필요하지 않구나!! 라는 걸 느낌

리스트로 바꾸지 않고, 문자열 상태에서 반복출력할 때에는 +를 이용해서 합쳐서 출력하면 된다.

참고로..! join은 리스트 속 문자열을 합쳐서 반환해주는 함수이다. (리스트 -> 문자열로..!)

더보기

'구분자'.join(리스트) : 리스트의 요소(원소)들을 구분자로 연결하여 문자열로 바꿔 return한다.

리스트 요소가 str일 경우에만 가능하다. 

 

 

5. 짝수, 홀수 개수

정수가 담긴 리스트 num_list가 주어질 때, num_list의 원소 중 짝수와 홀수의 개수를 담은 배열을 return 하도록 

# 내풀이
def solution(num_list):
    even = sum(1 for a in num_list if a%2==0)
    odd = sum(1 for a in num_list if a%2!=0)
    return [even,odd]

# 남의 풀이
def solution(num_list):
    answer = [0,0]
    for n in num_list:
        answer[n%2]+=1
    return answer

 

 

6. 중복된 숫자 개수

정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return

# 내풀이
def solution(array, n):
    return sum(1 for a in array if a ==n)

# 다른 사람
def solution(array, n):
    return array.count(n)

count..!!ㅋㅋㅋ 완전 간단해~~

count(n)은 말 그대로 n이 몇 개 있는지 세어주는매소드이다.

 

 

7. 배열 뒤집기

거꾸로 출력하기

#내풀이
def solution(num_list):
    return num_list[::-1]


# 다른 사람 풀이
def solution(num_list):
    num_list.reverse()
    return num_list
    

def solution(num_list):
    answer = []
    for i in range(1,len(num_list)+1):
        answer.append(num_list[-i])

    return answer
array[::] 사용법

먼저 기본 형태를 알고 있으면 어렵지 않다.
array[A:B:C] 는, 인덱스 A부터 B 전까지 C의 간격으로 배열을 만들어라는 의미 

예를 들어,
array[1:4:2]은 array의 인덱스 1부터 인덱스 4 전까지 2의 간격으로
array[::-1]은 처음부터 끝까지 -1칸 간격.. 즉 역순으로
array[1::-1]은 인덱스 1부터 끝까지 역순으로
array[1::2]은 인덱스 1부터 끝까지 2칸 간격으로 
array[:8:2]은 처음부터 인덱스 8 전까지 2의 간격으로
array.reverse() 사용할 때 주의: reverse()는 리스트 타입에서 제공되는 함수

 

 

8. 옷 가게 할인받기

import math
def solution(price):
    if price >= 500000:
        return math.trunc(price*0.8)
    elif price >= 300000:
        return math.trunc(price*0.9)
    elif price >= 100000:
        return math.trunc(price*0.95)
    else:
        return price
math.trunc vs math.floor 차이점 비교

math.trunc 는 소수점 이하는 버림
math.floor는 내림

양수에서는 둘다 출력값이 똑같다.
print(math.trunc(3.5))
>> 3
print(math.trunc(3.5))
>>3

음수에서는 차이가 있다.
print(math.trunc(-3.5))
>> -3
print(math.floor(-3.5))
>> -4

 

 

 

이상.. 끝..!