Day15 리스트(배열), 문자열

  • 조건에 맞게 수열 변환하기1
  • 조건에 맞게 수열 변환하기2
  • 1로 만들기
  • 길이에 따른 연산
  • 원하는 문자열 찾기

조건에 맞게 수열 변환하기 1

문제 설명

정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다. 그 결과인 정수 배열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(arr):
    answer = []
    for i in arr:
        if i >= 50 and i % 2 == 0:
            answer.append(i // 2)
        elif i < 50 and i % 2 == 1:
            answer.append(i * 2)
        else:
            answer.append(i)
    return answer

처음에는 조건이 2개라고 생각하고 풀었는데 

50보다 크거나 같은 짝수, 50보다 작은 홀수 < 이 두 조건에 해당하지 않는 값들도 있어서

if, elif, else로 나눔. 그 값들을 그대로 배열에 담아 리턴


조건에 맞게 수열 변환하기 2 

 

문제 설명

정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.

def solution(arr):
    answer = 0
    
    while True:
        temp = arr.copy()  # 기존 배열을 복사하여 temp에 저장
        
        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 == 1:
                arr[i] = (arr[i] * 2) + 1
        
        if arr == temp:  # 변형 전과 후의 배열이 같으면 반복 종료
            break
        
        answer += 1  # 반복 횟수 증가
    
    return answer

 

위 문제랑 비슷할 거라 생각했는데 다른 부분이

한번 반복할 때 배열 전체의 값이 조건에 따라 바뀌어야한다.

그래서 안쪽에 for문을 써줌

여기서 부터 안풀린게 대체되는게 아니라 계속 추가가 되는 것임.....

이 문제는 바뀐 temp 배열의 값을 빈 값으로 처리해주지 않아서 였다.

 

이후 계속 풀릴듯 말듯 ... 하는데 기존 코드에 문제가 있었다.

배열의 변형이 이루어질 때마다 arrtemp를 비교하는 것이 아니라, 변형 전 후의 배열이 동일한지를 확인해야 하는 것

위에서 arr = temp로 새로운 리스트를 생성하지 않고 copy 함.

변형이 계속되면 answer 을 1 증가시키고 계속 반복

이 후 이전 copy해둔 배열 temp와 반복문 후의 배열 arr를 비교해서 배열이 같아지면 더 이상 변하지 않으므로 반복문 종료

 

최종적으로 반복문이 종료되면 그때의 answer값 리턴..... 후 어렵네요?


1로 만들기

문제 설명

정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다. 예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다.
10 / 2 = 5
(5 - 1) / 2 = 4
4 / 2 = 2
2 / 2 = 1
위와 같이 4번의 나누기 연산으로 1이 되었습니다.정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    answer = 0
    for i in num_list:
        while i != 1:
            if i % 2 == 0:
                i = i // 2
            else:
                i = (i-1)//2
                
            answer += 1
    return answer

num_list의 원소 하나씩 순회

1이 되기 전까지 계속 while문을 실행하면서 1을 만들고 연산 횟수 1씩 answer에 카운트

1이 되면 그 다음 원소 또 실행

num_list 길이만큼 반복


길이에 따른 연산

문제 설명

정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    answer = 0
    if len(num_list) >= 11:
        return sum(num_list)
    else:
        return eval('*'.join(map(str, num_list)))
    return answer

길이가 11이상일 때는 sum 함수를 이용해서 간단하게 처리

모든 원소의 곱은 eval 함수를 이용해서 구했다.

join함수를 사용할 때

'*'.join(num_list)

이렇게만 쓰니까 에러가 났었는데, 그 이유는 정수형 배열 num_list와 문자 *을 join하려고 하니까 난 에러

그래서 num_list안의 배열들을 문자로 모두 변경한 후 *와 join해서 연결했다.

이후 eval 함수를 사용해 문자열로 표현된 파이썬 코드를 실행하여 결과 값을 반환해준다.

 

eval() 함수는 Python의 내장 함수 중 하나로,
문자열로 표현된 파이썬 표현식을 평가(evaluate)하여 결과를 반환합니다.
즉, 문자열로 표현된 파이썬 코드를 실행하는 역할을 합니다.

 

원하는 문자열 찾기

문제 설명

알파벳으로 이루어진 문자열 myString과 pat이 주어집니다. myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.단, 알파벳 대문자와 소문자는 구분하지 않습니다.

 

def solution(myString, pat):
    answer = 0
    if pat.lower() in myString.lower():
        return 1
    return answer

대소문자는 구분하지 않으니 모두 소문자로 변환 후 in 연산자로 pat 문자열이 있는지 확인

있으면 1 없으면 0 리턴

def solution(myString, pat):
    return int(pat.lower() in myString.lower())

다른 사람 풀이:

pat.lower() in myString.lower() >> True / False로 반환 int로 0,1 리턴

굳이 1,0을 할당해주지 않고 이렇게 활용도 가능하네요 .. good


2번 문제에서 너무 많은 시간을 빼앗겨버린 ... 오늘 늦잠자서 시간이 부족한데 자꾸 늘어지니 뭔가 불안 초조함 ..ㅋㅋㅋㅋㅋ큐ㅠ 앞으로 늦잠금지 ..여기에 얼마나 시간을 쓸지 모르니까 넉넉하게 할당해두고 하루를 보내기를 추천 ,, 

+ Recent posts