Day16 문자열

  • 대문자로 바꾸기
  • 소문자로 바꾸기
  • 배열에서 문자열 대소문자 변환하기
  • A 강조하기
  • 특정한 문자를 대문자로 바꾸기

대문자로 바꾸기

문제 설명

알파벳으로 이루어진 문자열 myString이 주어집니다. 모든 알파벳을 대문자로 변환하여 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString):
    return myString.upper()

 


소문자로 바꾸기

문제 설명

알파벳으로 이루어진 문자열 myString이 주어집니다. 모든 알파벳을 소문자로 변환하여 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString):
    return myString.lower()

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ리스펙 ..


배열에서 문자열 대소문자 변환하기

문제 설명

문자열 배열 strArr가 주어집니다. 모든 원소가 알파벳으로만 이루어져 있을 때, 배열에서 홀수번째 인덱스의 문자열은 모든 문자를 대문자로, 짝수번째 인덱스의 문자열은 모든 문자를 소문자로 바꿔서 반환하는 solution 함수를 완성해 주세요.

 

def solution(strArr):
    for i in range(len(strArr)):
        if i % 2 == 0:
            strArr[i] = strArr[i].lower()
        else:
            strArr[i] = strArr[i].upper()

    return strArr
def solution(strArr):
    answer = [value.lower() if idx % 2 == 0 else value.upper() for idx, value in enumerate(strArr)]
    return answer

enumerate로 index 활용하는게 더 간편한 듯 하다.


A 강조하기

문제 설명

문자열 myString이 주어집니다. myString에서 알파벳 "a"가 등장하면 전부 "A"로 변환하고, "A"가 아닌 모든 대문자 알파벳은 소문자 알파벳으로 변환하여 return 하는 solution 함수를 완성하세요.

 

def solution(myString):
    answer = ''
    answer = myString.replace('a', 'A')

    for idx, value in enumerate(answer):
        if value != 'A':
            answer = answer.replace(value, value.lower())
    return answer
def solution(myString):
    answer = ''
    answer = myString.lower()
    answer = answer.replace('a', 'A')
    return answer

잔머리 좀 굴려볼걸 역시 포문을 쓰지 않고 해결할 수 있는 방법이 있었어....

아직 나는 멀었다~

def solution(myString):
    return myString.lower().replace('a', 'A')

이렇게 해도 전부 바꿔주는 군요 ...


특정한 문자를 대문자로 바꾸기

문제 설명

영소문자로 이루어진 문자열 my_string과 영소문자 1글자로 이루어진 문자열 alp가 매개변수로 주어질 때, my_string에서 alp에 해당하는 모든 글자를 대문자로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, alp):
    if alp in my_string:
        my_string = my_string.replace(alp, alp.upper())
    return my_string

굳이 if문을 사용하지 않고

def solution(my_string, alp):
    return my_string.replace(alp, alp.upper())

그대로 return 해도 됐었군요 ..

알고보면 당연한 얘기지만 왜 문제풀 때는 떠오르지 않는 걸까요~


와 그래두 작심삼일을 넘어서 지금 연속 16일차까지 왔다 ㄷㄷ 대박

신년다짐이 이렇게 오래간다고? 천천히 느리지만 꾸준히 Let's Go ~

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

Day11

  • 문자 개수 세기
  • 배열 만들기 1
  • 글자 지우기
  • 카운트 다운
  • 가까운 1 찾기

문자 개수 세기

문제 설명

알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.

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

문자열을 아스키코드로 변경해서 A~Z까지는 65~90, a~z 까지는 97~122로 변경

[A,B,C,D,E,F,G,H...]

[65,66,67,68,69,70,,,]

0,1,2,3,4,5,6,7 ,,,,> 인덱스 번호

값이 65일 때 0번째 인덱스에 +1을 하는 방식


배열 만들기 1

문제 설명

정수 n과 k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(n, k):
    answer = [i for i in range(1, n+1) if i % k == 0]
    return sorted(answer)

글자 지우기

문제 설명

문자열 my_string과 정수 배열 indices가 주어질 때, my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, indices):
    answer = ''
    for i in range(len(my_string)):
        if i not in indices:
            answer += my_string[i]            
    return answer

카운트 다운

문제 설명

정수 start_num와 end_num가 주어질 때, start_num에서 end_num까지 1씩 감소하는 수들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(start, end):
    return [i for i in range(start, end-1, -1)]

가까운 1 찾기

문제 설명

정수 배열 arr가 주어집니다. 이때 arr의 원소는 1 또는 0입니다. 정수 idx가 주어졌을 때, idx보다 크면서 배열의 값이 1인 가장 작은 인덱스를 찾아서 반환하는 solution 함수를 완성해 주세요.단, 만약 그러한 인덱스가 없다면 -1을 반환합니다.

문제 설명 : 크면서 X > 크거나 같은 O 으로 수정하고 풀어야 맞음

테스트 케이스 3번이 아무리 봐도 맞는데 아니라해서 봤더니,, 설명 문제 ㅡㅡ 

def solution(arr, idx):
    answer = -1 
    for i in range(len(arr)):
        if i >= idx and arr[i] == 1:
            answer = i;
            break;
    return answer

 


오늘 일정 때문에 문제 못 풀 줄 알았는데 자기 전에 생각나서 풀고 잔다..

연속 11일 성공 ,, 작은 성공이 큰 성공을 !!! 너무 졸리지만 해내서 기뻐요 .. 

다들 굿나잇

+ Recent posts