TanzDev

TIL 30 (알고리즘 문제) 본문

기록보드/TIL

TIL 30 (알고리즘 문제)

Tanz-dev 2024. 3. 5. 23:00

금일은 프로그래머스에 관련된 0단계 문제들을 풀기 시작했다.

 

오늘 20문제 풀게되었는데 각각의 문제 정보를 공유해봐야겠다.

 

1. 머쓱이보다 키 큰사람

def solution(array, height):
    answer = 0
    for i in array:
        if i > height:
            answer += 1
    return answer

다른문제들도 비슷한게 많지만 거의 for문으로 해결되었다.

 

2. 배열 두배 만들기

def solution(numbers):
    answer = [num*2 for num in numbers]
    return answer

 

간단하게 num에 *2를 생각하다 짜보았는데 의외로 성공이었다..

 

3. 편지

def solution(message):
    answer = len(message)*2
    return answer

위와 비슷한 맥락이다.

 

4. 자릿수더하기

def solution(n):
    answer = sum(int(digit) for digit in str(n))
    return answer

n이 1234면 1+2+3+4를 해주는 식이었는데 sum을 이용해 해결했다.

 

5. 점의 위치 구하기

def solution(dot):
    if dot[0] > 0 and dot[1] > 0:
        return 1
    elif dot[0] < 0 and dot[1] > 0:
        return 2
    elif dot[0] < 0 and dot[1] < 0:
        return 3
    elif dot[0] > 0 and dot[1] < 0:
        return 4

팀원분들이 if문으로 작성했다는 이야기를 들었고, 다른 방법은 없을까 고심했지만

역시 if문으로 풀게되었다.

유사문제를 보게되었는데 두줄로 끝나는걸 보고 좌절했다.

 

6. 문자열안에 문자열

def solution(str1, str2):
    if str2 in str1:
        result = 1
    else:
        result = 2
    return result

if문으로 속하면 1, 속하지않으면 2로 출력하게 짤 수 있다.

 

7. 특정 문자열 제거하기

def solution(my_string, letter):
    result = ""
    for char in my_string:
        if char != letter:
            result += char
    return result

 

8. 중앙값 구하기

def solution(array):
    sort_array = sorted(array)
    md_list = len(sort_array) // 2
    md_value = sort_array[md_list]
    return md_value

len을 //2 로 나누어 풀이했는데, 유사문제를 보니 한줄로도 충분히 가능하다.

def solution(array):
    return sorted(array)[len(array) // 2]

 

9. 세균증식

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

 

n값의 시간에 증가에 따라 이중for문으로 작성했다.

def solution(s1, s2):
    return len(set(s1)&set(s2))

 

유사풀이에 좀더 간단하게 set함수를 사용하는 예가 있어서 시간이되면 공부해봐야겠다.

 

10. 최대값만들기

def solution(numbers):
    st_nums = sorted(numbers, reverse=True)
    lst_nums = st_nums[:2]
    result = lst_nums[0] * lst_nums[1]
    return result

약간의 꼼수처럼 st_nums[:2]라고 주었다

def solution(numbers):
    numbers.sort()
    return numbers[-2] * numbers[-1]

 

11. 피자나눠먹기(1)

def solution(n):
    pizzas = 1
    slices = 7
    while slices < n:
        pizzas += 1
        slices += 7
    return pizzas

피자는 혼자먹어야 제맛이다.

 

12.피자나눠먹기(3)

def solution(slice, n):
    pizzas = 1

    while slice * pizzas < n:
        pizzas += 1

    return pizzas

주말에 아내와 피자를 시켜먹었는데 너무 매워서 화가났다.

 

13. 양꼬치

def solution(n, k):
    yang_price = 12000
    drink = 2000

    order_yang_price = n * yang_price
    order_drink_price = k * drink
    discount = min(n // 10 , k) * drink

    total = order_drink_price + order_yang_price - discount

    return total

난관이었다. 적용할 수학문제가 떠오르지않아 discount부분은 검색해서 찾아냈고 다른부분을 어떻게 줄여야할지

고민이되었다. 약 40분간 풀었던것같은데 ..

def solution(n, k):
    return 12000 * n + 2000 * (k - n // 10)

print(solution(10, 3))

유사문제를 보고 참 대단한 사람이 많구나 생각했다.

 

14. 순서쌍의 개수

def solution(n):
    count = 0
    for i in range(1, n + 1):
        if n % i == 0:
            count += 1
           
    return count

n값에 대입한 수의 순서쌍 개수를 세어준다. n값을 20을 대입했고 6이 출력되었다. 

 

15. 옷가게 할인받기

def solution(price):
    discount = 0
    result = 0
    if price >= 500000:
        discount = price*0.2
        result = price
    elif price >= 300000:
        discount = price*0.1
        result = price
    elif price >= 100000:
        discount = price*0.05
        result = price
    else:
        result = price
   
    result = price - discount
    return int(result)

작은수부터 배열하니 오류가 났다. 연산자기호를 > 만 사용했더니 런타임 오류가 발생해서 >=로 수정해주었다.

 

16.배열자르기

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

10번 문제와 좀 비슷했는데 문제가 문자열 3개라서 꼼수처럼 사용할 수 있더라...

 

17. 짝수개수 출력하기

def solution(num_list):
    answer = [0, 0]
   
    for num in num_list:
        if num % 2 == 0:
            answer[0] += 1
        else:
            answer[1] += 1
   
    return answer

for문으로 몫이 0이면 짝수를, 1이면 홀수를 출력하게 해주고 answer에 대입해줬다.

 

18. 문자반복 출력하기

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

for문에 i * n을 해주니 헤에에엘로오오오가 나왔다.

 

19. 모음제거

def solution(my_string):
    answer = ''
    mo = ["a", "e", "i", "o", "u"]
   
    for i in my_string:
        if i not in mo:
            answer += i
   
    return answer

for문으로 모음을 속하지않게 해줬다.

 

금일 문제풀면서 크게 느낀점은 분명히 지난날들보다 성장을 하고있는것같은데...

문제를 접하면 접할수록 한계를 시험하는 느낌이 온다. 

 

오늘 세션문제로 백준의 숫자야구, 그리디알고리즘과 완전탐색알고리즘 외 등등 몇가지 출제되었는데, 개념은 이해가되나 어떻게 풀어야할까에 대해 막막함이 앞섰던것같다.

 

숫자야구 한번 더 복습해보고싶긴한데, 노션이 잠겨있는거같다

 

옛날 설계할때 통곡의 벽을 느껴갔던적이있는데, 그 벽을 지나가면 엄청 이해가 쉬워진다. 삼각법으로 아무리 돌려보고해도 안보이던 도면들이었는데, 숙달되면 머릿속에 3차원으로 그려진다. 거기까지 2년이 넘게 걸렸다.

 

이번 알고리즘을 풀며 다가오는 수학적 난제들이나, 문제를 풀어가는 과정에서의 중요한부분을 캐치해서 이용하는 능력 등 여러가지 요소들이 참 중요하다고 느껴지는데...알고리즘은 통곡의벽이 맞는거같다.

 

저만치 달려나가고있는 다른 수강생분들이 대단하다 생각된다.

 

통곡의벽 뚫는중...🧱🧱🧱🧱🧱🧱🧱

'기록보드 > TIL' 카테고리의 다른 글

TIL 32 (알고리즘 문제)  (1) 2024.03.07
TIL 31 (알고리즘 문제)  (0) 2024.03.07
TIL 29 (알고리즘)  (1) 2024.03.04
TIL 28 (개별과제 마무리)  (0) 2024.02.29
TIL 27 (개인 마지막 과제)  (0) 2024.02.28