아자아자 화이팅이닷 !

231014 프로그래머스 문제풀기 본문

TIL

231014 프로그래머스 문제풀기

유초23 2023. 10. 14. 22:49
728x90

사실 어제 올리려고 했는데 오늘 올림 ^^ ....

오랜만에 글을 써본댜,,

다시 아자아자 화이팅을 해봐야게따 ..!

다른 일들을 하느라 좀 까먹은듯하지만 힘내서 해봐야쥥 ,,

힘내자 나 자신아 ^^ !


* 문자 개수 세기 문제에서

어떻게 문제를 풀어야할지 감이 잘안와서 구글링을 해보았돠 ㅋ.ㅋ ..

 

제일 직관적으로 푸는 방법은

def solution(my_string):
    answer = [0] * 52
    chars = { "A": 0, "B": 1, "C": 2, "D": 3, "E": 4, "F": 5, "G": 6, "H": 7, "I": 8, "J": 9, "K": 10, "L": 11, "M": 12, "N": 13, "O": 14, "P": 15, "Q": 16, "R": 17, "S": 18, "T": 19, "U": 20, "V": 21, "W": 22, "X": 23, "Y": 24, "Z": 25, "a": 26, "b": 27, "c": 28, "d": 29, "e": 30, "f": 31, "g": 32, "h": 33, "i": 34, "j": 35, "k": 36, "l": 37, "m": 38, "n": 39, "o": 40, "p": 41, "q": 42, "r": 43, "s": 44, "t": 45, "u": 46, "v": 47, "w": 48, "x": 49, "y": 50, "z": 51 }
    
    for i in my_string:
        cnt = my_string.count(i)
        answer[chars[i]] = cnt
    
    return answer

 

이렇게 푸는 건데 ,,

 

더 깔끔하고 간결한 코드는

def solution(my_string):
    answer = [0] * 52
    for i in my_string:
        if i.isupper():
            answer[ord(i) - 65] += 1
        else:
            answer[ord(i) - 71] += 1
    return answer

 

이렇게 푸는 것이다 !

 

여기에서 

알파벳 A의 아스키 코드 → 65 / a 의 아스키 코드 → 97
대문자 A~Z의 배열 인덱스가 0~25이 되고 a~z의 배열 인덱스가 26~52
따라서 대문자의 경우 아스키 코드에서 65를 빼줘야하고 소문자의 경우 71을 빼줘야한다 !

 

그리고 ord함수는 문자의 순서 위치값을 의미한다.

ord(A) #65
ord(B) #66

이런식으로 !

 

마지막 코드가 제일 좋은 코드인 것 같다 !


* 배열 만들기 4 문제에서

 

처음에

def solution(arr):
    stk = []
    for i in range(len(arr)):
        if len(stk) == 0:
            stk.append(arr[i])
        elif stk[-1] < arr[i]:
            stk.append(arr[i])
        elif stk[-1] >= arr[i]:
            stk.pop()
            stk.append(arr[i])
    return stk

 

이렇게 코드를 짰는데, 테스트 케이스는 통과했는데 채점 결과는 하나도 통과하지 못했다 ^^ ...

 

힌트를 얻은건 for문으로 돌리는게 아니라 while문으로 돌려야하는건가 ? 싶은 점 !

 

그렇게 짠 코드는

def solution(arr):
    stk,i = [],0

    while i < len(arr):
        if not len(stk):
            stk.append(arr[i])
            i += 1
        elif len(stk):
            if stk[-1] < arr[i]:
                stk.append(arr[i])
                i += 1
            elif stk[-1] >= arr[i]:
                stk.pop()
    return stk

 

요것이다 !

 

근데 더 간결한 코드를 발견해똬

 

def solution(arr):
    stk = []
    for i in range(len(arr)):
        while stk and stk[-1] >= arr[i]:
            stk.pop()
        stk.append(arr[i])
    return stk

 

맨 마지막 조건 빼고는 조건이 같다는 점을 이용해서 간결하게 코드를 짠 것 같다 ,,

와웅 ..

 


* 문자열 계산하기 문제에서

처음에

 

def solution(my_string):
    a,b,c = my_string.split(" ")
    while b == "+":
        return int(a) + int(c)
    return int(a) - int(c)

 

이렇게 코드를 짰는데 채점 결과가 하나도 통과하지 못해서 뭐가 문제지 ..? 하고 있었는데

연산자가 하나가 아닐수도 있다는 말을 보고 OMG했돠 ..

왜 그걸 생각을 안하고 있었쥐 ㅋ ..

 

그래서

def solution(my_string):
    answer = 0
    
    if "+" in my_string:
        a = my_string.split(" + ")
        answer += int(a)
    elif "-" in my_string:
        a = my_string.split(" - ")
        answer -= int(a)
    return answer

 

이렇게 코드를 짜봤는데

TypeError: int() argument must be a string, a bytes-like object or a number, not 'list' 이런 오류가 나왔다 ㅋ.ㅋ ..

 

이 문제는 처음값을 일단 저장하고, 그다음 + ~ 나 - ~ 의 규칙을 찾아서 코드를 짜면 해결되는 문제였다 !

그렇게 짠 코드는

def solution(my_string):
    a = my_string.split()
    answer = int(a[0])
    
    for i in range(1,len(a)):
        if a[i] == "+":
            answer += int(a[i+1])
        elif a[i] == "-":
            answer -= int(a[i+1])
    return answer

이렇다 !

 

이 문제를 가장 간단하게 해결할 수 있는 방법은 eval 함수를 사용하는 것이었다 !

 

eval 함수는 수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환하는 함수이다 !

>>> result = eval("(3 + 5) * 7")
>>> print(result)
56

이런식으로 말이당

 

그래서 그냥 

def solution(my_string):
    return eval(my_string)

이렇게 해주는 정답라는고 ,,

와웅 ,,

 

마지막으로 굉장히 신선했던 코드가 있는데,

def solution(my_string):
    return sum(int(i) for i in my_string.replace(' - ', ' + -').split(' + '))

바로 이 코드이다 !

 

여기에서 replace함수를 쓸거라고는 생각을 못했는데 발상이 좋은 것 같다 !

 


하..... 임시저장 계속 하고있었는데 왜 새로고침하니까 중간 다 날라갔죠 ..? ^^ .....

화가나요 .....


* 문자열 밀기 문제에서는

find함수를 사용하면 아주 간단하게 문제를 해결할 수 있었다 !

 

def solution(A,B):
    return (B*2).find(A)

 

여기에서 find() 함수는 인자로 받은 문자열의 처음 인덱스를 리턴하고, 만약 찾지 못하면 -1을 리턴하는 것을 이용하여 풀면 된다 !

 

그리고 직관적으로 푼 코드는

def solution(A,B):
    for i in range(len(A)):
        if A == B:
            return i
        else:
            A = A[-1] + A[:-1]
    return -1

이렇다 !


* 특이한 정렬 문제에서는

어떻게 풀어야할지 감이 안와서 구글링을 했다 !

 

이 문제에서는 lambda함수를 사용하면 비교적 간단하게 문제를 해결할 수 있었다 !

 

lambda함수는

https://velog.io/@euisuk-chung/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%8B%9C%EA%B0%81%ED%99%94-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0-%EB%9E%8C%EB%8B%A4Lambda-%ED%95%A8%EC%88%98

 

파이썬 마스터하기 : 람다(Lambda) 함수

람다(lambda) 함수는 함수형 프로그래밍에서 중요한 개념 중 하나로, 익명 함수(anonymous function)라고도 부릅니다.

velog.io

를 참조하면 좋을 것 같다 !

 

그래서

def solution(numlist,n):
    result = sorted(numlist, key = lambda x : (abs(x-n), -x))
    return result

이렇게 문제를 해결 할 수 있다 !

 

이 문제는 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 필요로 하는데,

어떠한 기준을 삼아 정렬을 하는 문제는 lambda로 해결할 수 있다.

 

따라서 매개변수 x numlist 배열을 돌면서, 각 요소와의 차이를 절댓값 method인 abs로 구한다.
이때 내림차순으로 구현하기 위해 -x 로 부여한다.


오늘은 여기까지 !

빨리 끝내자고 ,,

728x90