TIL

230809 온라인 스터디 & 프로그래머스 문제풀기

유초23 2023. 8. 9. 23:48
728x90

* 소인수분해 문제는

 

어떻게 문제를 해결해야할지 감을 못잡다가 while문을 써서 풀어봤는데 실행시간이 너무 오래걸렸다 ,,

다 while문에 넣지 않고 밑에 for문을 써주면 간단하지는 않지만 실행은 되는 코드를 발견했다.

 

def solution(n):
    prime_factor = []
    answer = []
    i = 2
    while i <= n:
        if n % i == 0:
            prime_factor.append(i)
            n //= i
        else:
            i += 1

    for x in prime_factor:
        if x not in answer:
            answer.append(x)
    return answer

좀 많이 길긴하다 ,, 

 

근데 while문만 써도 풀리는 문제였다..

def solution(n):
    answer = []
    i = 2
    while i <= n:
        if n % i == 0:
            n //= i
            if i not in answer:
                answer.append(i)
        else:
            i += 1
    return answer

이렇게 하면 해결되는 문제 ,,

나는 n //= if를 if i not in answer: 안에다 넣어줬었는데, 그 위에 써줘야 되는거였나보다 ,, ㅠ


*2의 영역 문제는

 

하 ......... 모르겠다 모르겠어 .......

나에게 답을 줘라 줘 .....

이건 누군가에게 물어봐야할 것 같다 ^-ㅠ

시간이 너무 많이 들었다 ㅠ

 

그래서 스터디장님께 힌트를 얻었다 !

 

def solution(arr):
    for i in arr:
        if i == 2:
            a = arr.index(i)
    for i in arr[::-1]:
        if i == 2:
            b = arr.index(i)
    return [-1]
    for i in arr[a:b+1]:
        return i

 

이렇게  짜 보았는데 ... 음 .....

안되네 (;′⌒`)

오프라인 스터디할 때 가져가서 물어봐야겠다 ^^ .........


* 조건에 맞게 수열 변환하기 2 문제에서

 

일단

def solution(arr):
    answer = []
    count = 0
    while answer != arr:
        answer = arr
        for i in range(len(arr)):
            if arr[i] >= 50 and arr[i] % 2 == 0:
                arr[i] //= 2
            elif arr[i] < 50 and arr[i] % 2:
                arr[i] = (arr[i]*2) + 1
            else:
                arr[i] = arr[i]
        count += 1
    count += 1
    return count

머리가 굴러가는대로 코드를 짜봤지만 실 패 ㅋ ..

 

검색찬스를 써서 all()함수와 zip()함수를 써서 문제를 해결하는 방법을 찾았다 !

 

파이썬 내장함수 중 any()와 all()이 있다. 둘은 아큐먼트로 iterable한 객체를 받는데 이 객체를 돌면서 조건을 검사해 답을 True/False의 답을 반환한다.

  • any() : 하나라도 True인게 있으면 True
  • all() : 모두 True여야 True 반환

쉽게 생각해 any는 or, all은 and 연산이라 보면 된다.

 

EX)

>>> any([False, False, False])
False
>>> any([False, True, False])
True
>>> all([False, True, False])
False
>>> all([True, True, True])
True

 

아래의 링크를 참고하면 좋을 것 같다 !

 

https://velog.io/@kho5420/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-any-%EC%99%80-all-%EC%96%B8%EC%A0%9C-%EC%96%B4%EB%96%BB%EA%B2%8C

 

[Python] 파이썬 any 와 all 언제 어떻게?

all 함수란? > all 함수는 인자로 받은 모든 요소가 참(True)이면 참(True)을 반환하고 하나라도 거짓(False)이면 거짓(False)을 반환한다. 단, all 이라는 함수는 인자로 반복 가능한 (iterable) 자료형을 받

velog.io

 

그리고 zip()함수는

 

>>> numbers = [1, 2, 3]
>>> letters = ["A", "B", "C"]
>>> for i in range(3):
...     pair = (numbers[i], letters[i])
...     print(pair)
...
(1, 'A')
(2, 'B')
(3, 'C')

 

이렇게 사용하는 함수이다 ! 기억이 흐릿해져서 다시 찾아봤다 !

 

https://www.daleseo.com/python-zip/

 

파이썬의 zip() 내장 함수로 데이터 엮기

Engineering Blog by Dale Seo

www.daleseo.com

 

그래서 이 문제를 해결해보면

 

def solution(arr):
    count = 0
    prev = arr

    while True:
        change = []
        for i in prev:
            if i >= 50 and i % 2 == 0:
                change.append(i // 2)
            elif i < 50 and i % 2:
                change.append(i*2 +1)
            else:
                change.append(i)

        same = all(a == b for a,b in zip(prev,change))

        if same:
            break
        count += 1

        prev = change

    return count

 

이렇게 풀 수 있다 ,,

이 코드를 녹여내는데에 시간이 좀 걸렸다 ,,


코드잇 강의는 내일부터 들어봐야겠다 ..!

화이팅하자고 ,,~!

 

728x90