Day20  함수(메서드)

  • 배열의 길이를 2의 거듭제곱으로 만들기
  • 배열 비교하기
  • 문자열 묶기
  • 배열의 길이에 따라 다른 연산하기
  • 뒤에서 5등까지

배열의 길이를 2의 거듭제곱으로 만들기

문제 설명

정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr):
    int2 = [2**i for i in range(0, 12)]

    while len(arr) not in int2:
        arr.append(0)

    return arr

2의 정수 거듭제곱을 int2에 담아두고

arr의 길이가 정수 거듭제곱과 일치할 때까지 0을 arr에 append


배열 비교하기

문제 설명

이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.
1. 두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.
2. 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.

두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr1, arr2):
    answer = 0
    
    if len(arr1) == len(arr2):
        if sum(arr1) > sum(arr2): return 1
        elif sum(arr1) < sum(arr2): return -1
        else: return 0
                    
    return 1 if len(arr1) > len(arr2) else -1

두 배열의 길이가 다를 때 1 or -1 뿐이니 비교 후 바로 return

두 배열의 길이가 같을 때는 1 or -1 or 0로 3가지 경우가 나오니 if elif else로 비교 후 return


문자열 묶기

문제 설명

문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

제한사항

def solution(strArr):
    answer = 0 
    count = [0] * 31
    for i in strArr:
        count[len(i)] += 1
    return max(count)

원소의 길이의 개수를 저장할 count 배열을 0으로 채워서 만든 후

원소의 길이를 각 배열에 인덱스와 매칭해서 +1씩 더함

처음에 count 배열을 [0] * 30로 해서 계속 실패했음 인덱스는 0부터고 최대길이는 30이니

길이가 30일 때 count[31]에 카운팅되어야 하므로 31까지 생성해주는게 맞음


배열의 길이에 따라 다른 연산하기

문제 설명

정수 배열 arr과 정수 n이 매개변수로 주어집니다.
arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을,
arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr, n):
    start = 0 if len(arr) % 2 == 1 else 1
    for i in range(start, len(arr), 2):
        arr[i] += n
    return arr

 

+2씩 증가시키니 start 값에 따라 짝수 인덱스에 더할지, 홀수 인덱스에 더할지가 결정됨, 

포문의 start값을 arr의 길이가 홀수일 때 0, 짝수일 때 1로 지정


뒤에서 5등까지

문제 설명

정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
def solution(num_list):
    answer = sorted(num_list)
    return answer[:5]

정렬 후 5개 슬라이싱

def solution(num_list):
    return sorted(num_list)[:5]​

한 줄이라도 코드 줄이기 


주제가 며칠동안 배열, 리스트였었는데 오늘은 새로운 주제인 함수가 등장했다

어제 어떤 블로그에서 코드를 치면서 계속 고민하는게 아니라 적으면서 답을 찾은 후 코드는 짧게 끝내는 것이라고 했다

그래서 오늘은 끄적이면서 먼저 답을 찾은 후 코드를 쳤는데 뭔가 머릿속으로 정리가 되면서 답을 찾은 느낌이라 더 잘풀리는 듯 했다. 오늘 코드들이 길지는 않은데 헷갈리는 부분들이 있어서 생각보다 오래걸리기도 했지만 그래도 오늘도 성공~

작은 성취감들이 나를 더 단단하게 만든다 후후 20일차 돌파 !!! 

Day19

  • 세 개의 구분자
  • 배열의 원소만큼 추가하기
  • 빈 배열에 추가, 삭제하기
  • 배열 만들기 6
  • 무작위로 K개의 수 뽑기

세 개의 구분자

문제 설명

임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

 

def solution(myStr):
    answer = []
    value = ''
    for i, v in enumerate(myStr):
        if v == 'a' or v == 'b' or v == 'c':
            if value == '':
                continue
            answer.append(value)
            value = ''
            continue
        else:
            value += v

    if value != '':
        answer.append(value)

    return answer if answer else ['EMPTY']

a, b, c가 아닐 때 value에 문자 하나씩 더하다가 a,b,c를 만나면 value에 저장된 문자열을 answer에 append함

그리고 value는 다시 빈 값, 그렇게 myStr 반복

값은 잘 들어가는데 공백이 포함되어서 첫번째 if 문안에 if문으로 빈 값일 때, continue해주어 해결했다.

 

def solution(myStr):
    answer = [x for x in myStr.replace('a', ' ').replace('b', ' ').replace('c', ' ').split() if x]
    return answer if answer else ['EMPTY']

다른 사람 풀이 : 

a,b,c를 공백으로 대체하고 공백기준으로 split ,, 천재인가 


배열의 원소만큼 추가하기

문제 설명

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 양의 정수 배열 arr가 매개변수로 주어질 때, arr의 앞에서부터 차례대로 원소를 보면서 원소가 a라면 X의 맨 뒤에 a를 a번 추가하는 일을 반복한 뒤의 배열 X를 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr):
    answer = []
    for i in arr:
        for j in range(i):
            answer.append(i)

    return answer

정석대로 arr의 원소 i를 i번 반복한 값을 answer에 담아 반환

def solution(arr):
    answer = []
    for num in arr:
        answer += [num] * num
    return answer

다른 사람 풀이 : 이중 포문을 쓰지 않은 코드! 성능 면에서 이 코드가 더 깔끔하고 나은듯


빈 배열에 추가, 삭제하기

문제 설명

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때, flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.

def solution(arr, flag):
    answer = []
    for i, value in enumerate(flag):
        if value:
            answer += [arr[i]] * arr[i] * 2
        else:
            answer = answer[:-arr[i]]
    return answer

true일 때, arr[i]가 3이면 세 개 출력 후 * 2, 4면 네 개 출력 후 * 2

false일 때 arr[i]의 수만큼 뒤에서 잘라야하니까 거꾸로 슬라이싱 사용

설명을 차근차근? 읽으면 나름 수월하게 풀리는 문제

입출력 예랑 똑같이 나와서 그냥 쾌감 ..요호호


배열 만들기 6

문제 설명

0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만드려고 합니다.i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.만약 stk이 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고 i에 1을 더합니다.stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.위 작업을 마친 후 만들어진 stk을 return 하는 solution 함수를 완성해 주세요.단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.

 

def solution(arr):
    stk = []
    i = 0
    while i < len(arr):
        if stk != [] and stk[-1] == arr[i]:
            stk.pop()
        else: 
            stk.append(arr[i])
        i += 1
    return stk if stk else [-1]

설명에서 조건이 3개로 나누어지는데조건 1, 3번의 실행할 코드는 동일해서 조건을 2가지로 간추려 작성할 수 있었다.

이것도 그냥 설명 잘 따라가면 풀리는 문제


무작위로 K개의 수 뽑

문제 설명

랜덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 k의 배열을 예상해봅시다.정수 배열 arr가 주어집니다. 문제에서의 무작위의 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.

처음에 짠 코드

테스트 코드는 다 통과하는데 실행 결과에서 다 실패가 뜨는거임

다른 사람들도 보니까 나랑 같은 경우가 많았는데 문제는 set이었다.

설명을 보면 arr에 저장된 순서대로 answer을 반환해야하는데

set을 사용하면 arr 원소의 순서가 바뀌게 될 가능성이 있다는 것

def solution(arr, k):
    answer = []
    newarr = []
    for i in arr:
        if i not in newarr:
            newarr.append(i)

    for i in range(k):
        try:
            answer.append(newarr[i])
        except:
            answer.append(-1)
    return answer

그래서 set을 사용하지 않고, for문을 사용해서 중복제거 된 새로운 배열을 만들었다.

def solution(arr, k):
    ret = []
    for i in arr:
        if i not in ret:
            ret.append(i)
        if len(ret) == k:
            break

    return ret + [-1] * (k - len(ret))

다른 사람 풀이 : 

나는 포문을 두 번 사용했는데 굳이 새로운 배열을 또 만들 필요가 없었다.

배열에 중복되지 않은 원소를 계속 append하다가

배열이 k의 길이와 같아질 때 멈추면 된다.

그리고 만약 배열이 k의 길이보다 짧다면 k의 길이만큼 -1로 채운 값을 리턴한다.


왕 내일 20일차다 대박

Day18 문자열

  • x 사이의 개수
  • 문자열 잘라서 정렬하기
  • 간단한 식 계산하기
  • 문자열 바꿔서 찾기
  • rny_string

x 사이의 개수

문제 설명

문자열 myString이 주어집니다. myString을 문자 "x"를 기준으로 나눴을 때 나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString):
    answer = [len(i) for i in myString.split('x')]
    return answer

문자열 잘라서 정렬하기

문제 설명

문자열 myString이 주어집니다. "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.단, 빈 문자열은 반환할 배열에 넣지 않습니다.

 

def solution(myString):
    answer = myString.split('x')
    new = []
    for i in answer:
        if i != "":
            new.append(i)

    return sorted(new)
def solution(myString):
    return sorted(ch for ch in myString.split('x') if ch)

if문으로 원소를 바로 true/false 처리해서 true인 원소들만 정렬하기


간단한 식 계산하기

문제 설명

문자열 binomial이 매개변수로 주어집니다. binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다. 주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.

 

def solution(binomial):
    return eval(binomial)

다른 언어 풀이 보면 정석대로 풀긴 했는데 이런거 보면 파이썬 너무 양아치인거 같기도 하고 ...


문자열 바꿔서 찾기

문제 설명

문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.

def solution(s, pat):
    for idx, value in enumerate(s):
        if value == 'A':
            s = s[:idx] + 'B' + s[idx+1:]
        else:
            s = s[:idx] + 'A' + s[idx+1:]
    
    return int(pat in s)

replace를 쓰다가 자꾸 전체가 바뀌어버려서 문자열 연결로 풀었음

def solution(myString, pat):
    return int(pat in myString.replace('A', 'C').replace('B', 'A').replace('C', 'B'))

다른 사람 풀이1: replace로 A를 일단 C로 대체해서 바꾼 것 

def solution(myString, pat):
    return int(''.join(['A' if i == 'B' else 'B' for i in pat]) in myString)

다른 사람 풀이2: myString이 아니라 pat을 이용한 사람도 있다 신박하다

 


rny_string

문제 설명
'm'과 "rn"이 모양이 비슷하게 생긴 점을 활용해 문자열에 장난을 하려고 합니다. 문자열 rny_string이 주어질 때, rny_string의 모든 'm'을 "rn"으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(rny_string):
    return rny_string.replace('m', 'rn')

아 난이도를 좀 올려야하나..? 너무 쉬운 곳에 안주하며 머무나 .. 음 일단 기초문제까지는 끝내보자잣

Day17 문자열

  • 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기
  • 문자열이 몇 번 등장하는지 세기
  • ad 제거하기
  • 공백으로 구분하기 1
  • 공백으로 구분하기 2

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

문제 설명

문자열 myString과 pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString, pat):
    answer = ''
    idx = 0
    if pat in myString:
        idx = myString.rindex(pat) + len(pat)-1
    answer = myString[:idx+1]
    return answer

myString에서 pat을 찾고 시작 인덱스가 아니라 끝 인덱스를 알아야 하니까 pat의 길이에서 -1 값으로 idx 를 찾았다

이후 처음부터 idx까지 슬라이싱

def solution(myString, pat):
    answer = myString[:myString.rindex(pat) + len(pat)]
    return answer

뭔가 비슷한듯 다른 다른 사람들 풀이가 많아서 내 코드를 수정해봤는데 5-6번째 줄 코드를 합치면

저렇게나 간략해진다. if문 굳이 쓸 필요가 없었다.


문자열이 몇 번 등장하는지 세기

문제 설명

문자열 myString과 pat이 주어집니다. myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString, pat):
    answer = 0
    for i in range(len(myString)):
        if myString[i:i+len(pat)] == pat:
            answer +=1
    return answer

myString을 순회하면서 pat의 길이만큼의 문자열을 pat이랑 비교한 후 일치하면 +1

find랑 rfind로 풀어보려고 했는데 앞, 뒤 제외한 중간에서 겹치는 문자열을 찾을 수가 없어서 포기 ..

def solution(myString, pat):
    answer = 0
    for i, x in enumerate(myString) :
        if myString[i:].startswith(pat) :
            answer += 1
    return answer
startswith() 함수
문자열이 지정된 접두사(prefix)로 시작하는지 여부를 확인하기 위한 파이썬의 문자열 메서드


ad 제거하기

문제 설명

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

 

def solution(strArr):
    answer = []
    for idx, value in enumerate(strArr):
        if 'ad' not in value:
            answer.append(strArr[idx])

    return answer

not in 연산자를 사용해서 ad가 없으면 배열 answer에 추가, 있으면 pass


공백으로 구분하기 1

문제 설명

단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string):
    return my_string.split(' ')

my_string 문자열을 공백으로 구분하여 리스트로 반환

split() 함수
문자열을 특정 구분자(delimiter)를 기준으로 나누어 리스트로 반환하는 파이썬의 문자열 메서드

공백으로 구분하기 2

문제 설명

단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

def solution(my_string):
    return my_string.split()

응?

 

split(' ')과 split()의 차이는

split(' ')을 사용하면 공백으로 나누다 연속된 공백이 있을 때 공백(빈 문자열)까지 리스트에 포함된다.

split()은 연속된 공백도 하나의 공백으로 간주하여 나눈다.

결론은 공백으로 구분하기1도 split() 사용해도 정답이었음

 

근데 공백으로 구분하기2에는 split(' ') 사용하면 안된다.

연속된 공백이 있으면 공백을 빈 문자열로 배열에 포함하여 리스트를 생성하기 때문


 

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

Day14 리스트(배열)

  • 홀수 vs 짝수
  • 5명씩
  • 할 일 목록
  • n보다 커질 때까지 더하기
  • 수열과 구간 쿼리 1

홀수 vs 짝수

문제 설명

정수 리스트 num_list가 주어집니다. 가장 첫 번째 원소를 1번 원소라고 할 때, 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 return 하도록 solution 함수를 완성해주세요. 두 값이 같을 경우 그 값을 return합니다.

 

def solution(num_list):
    answer = 0
    a = 0
    b = 0
    for i in range(len(num_list)):
        if i % 2 == 0:
            a += num_list[i]
        else:
            b += num_list[i]

    return a if a == b else max(a,b)

가장 첫번째 원소를 1번 원소라고 할 때, > 이 부분에서 인덱스 번호를 주의해야겠다 싶었는데

어차피 짝, 홀수이고 간격은 2씩 차이나니까 신경쓰지 않고 풀었다

def solution(num_list):
    return max(sum(num_list[::2]), sum(num_list[1::2]))

다른 사람 풀이 : 

0부터 간격을 2씩 더하기

1부터 간격을 2씩 더하기

그 중 큰 값 출력 풀이 굿 ..


5명씩

문제 설명

최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 names가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 완성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다.

 

def solution(names):
    return names[::5]

바로 위 문제 풀이 응용했는데 단순에 풀려버린.. 

쉽게 풀리면 그대로 뭔가 찝찝함 그래도 파이썬 최고


할 일 목록

문제 설명

오늘 해야 할 일이 담긴 문자열 배열 todo_list와 각각의 일을 지금 마쳤는지를 나타내는 boolean 배열 finished가 매개변수로 주어질 때, todo_list에서 아직 마치지 못한 일들을 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(todo_list, finished):
    answer = []
    for idx, value in enumerate(finished):
        if value == False:
            answer.append(todo_list[idx])
    return answer

배열의 길이는 같으니 신경쓰지 않고, finished 배열의 값이 false일 때의 인덱스들만 answer에 담아 출력

def solution(todo_list, finished):
    return [work for idx, work in enumerate(todo_list) if not finished[idx]]

비슷한 코드이지만 for문을 나는 finished로 돌리고 이 사람은 todo_list를 돌려서 idx 값을 바로 활용했다.

뭔가 이게 더 깔끔하고 잘 짠 코드인듯? 굿


n보다 커질 때까지 더하기

문제 설명

정수 배열 numbers와 정수 n이 매개변수로 주어집니다. numbers의 원소를 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 이때까지 더했던 원소들의 합을 return 하는 solution 함수를 작성해 주세요.

 

def solution(numbers, n):
    answer = 0
    for i in numbers:
        if answer <= n:
            answer += i
    return answer

n보다 작을 때 반복문을 돌리다가 n보다 커지면 조건에 성립하지 않아 그때의 answer 리턴

def solution(numbers, n):
    answer = 0
    i=0
    while answer<=n:
        answer+=numbers[i]
        i+=1
    return answer​

다른 사람 풀이 :

조건문을 걸고 for문을 쓰는 것보다

조건문을 사용하지 않고 바로 while문으로 처리해버리는게 더 깔끔한 것 같다. 굿


수열과 구간 쿼리 1

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e] 꼴입니다.각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 arr[i]에 1을 더합니다.위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

def solution(arr, queries):
    answer = []
    for i in range(len(queries)):
        s, e = queries[i]
        for j in range(s, e+1):
            arr[j] += 1
    return arr

중첩 반복문 없이 풀고 싶어서 이것저것 시도해보다 결국 풀이가 생각 안나서 그냥 이렇게 풀어버림

queries 길이만큼 반복하고 [s,e]꼴을 순서대로 또 반복해서 arr 배열에 s부터 e까지의 범위에 +1을 하기

def solution(arr, queries):
    for l,r in queries:
        for i in range(l,r+1): arr[i]+=1
    return arr

다른 사람 풀이 :

다른 사람들도 다 나랑 비슷하게 푼 것 같아서 다행?

나랑 비슷한듯 하지만 조금 더 코드가 짧고 깔끔한 것 같다.

짧고 깔끔하게 짜는 연습도 해야겠다.


 

Day13 리스트(배열)

  • n번째 원소부터
  • 순서 바꾸기
  • 왼쪽 오른
  • n번째 원소까지
  • n개 간격의 원소

n번째 원소부터

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, n 번째 원소부터 마지막 원소까지의 모든 원소를 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list, n):    
    return num_list[n-1:]

3번째 원소면 2번째 인덱스부터 시작해야 하니 슬라이싱 n-1부터 끝까지


순서 바꾸기

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, num_list를 n 번째 원소 이후의 원소들과 n 번째까지의 원소들로 나눠 n 번째 원소 이후의 원소들을 n 번째까지의 원소들 앞에 붙인 리스트를 return하도록 solution 함수를 완성해주세요.
def solution(num_list, n):
    return num_list[n:] + num_list[:n]

슬라이싱할 때 n번째 원소, 인덱스 헷갈림 주의


왼쪽 오른쪽

문제 설명

문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다. str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요. "l"이나 "r"이 없다면 빈 리스트를 return합니다.

 

def solution(str_list):
    for i in range(len(str_list)):
        if str_list[i] == "l":
            return str_list[:i]
        elif str_list[i] == "r":
            return str_list[i+1:]

    return []

 

계속 65, 75점으로 실패하다가 코드 간단하게 수정했더니 이왜진 ...??

간단하게 생각해서

리스트에서 l이 있으면 그때의 인덱스 왼쪽 값 return

r이 있으면 그때 인덱스부터 오른쪽 값 return 

둘다 아니면 빈 배열 리턴 ㅎㅎ;

간단한 문제에서 시간 빼앗긴 기분이라 허무하다


n번째 원소까지

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 n 번째 원소까지의 모든 원소를 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list, n):
    return num_list[:n]

n개 간격의 원소들

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list, n):
    return num_list[::n]

파이썬아 고마워 .. 날먹하면서도 이게 맞는건지 싶음. ㅋㅋㅋ

ㅋㅋㅋㅋ 그냥 웃겨서 ...


빨리 기초 끝내고 난이도 올리고 싶다 !!

쉽다고 갑자기 어려운 문제 풀어버리면 꾸준히 못할 것 같아서

느리지만~ 천천히 한단계씩 올라가는 중

세번째 문제에서 헷갈려서 계속 반례 ...

근데 생각보다 너무 간단한 답이어서 허무 ..

그래두 해냈어요 오늘두 야호

 

Day12 리스트(배열)

  • 리스트 자르기
  • 첫 번째로 나오는 음수
  • 배열 만들기 3
  • 2의 영역
  • 배열 조각하기

리스트 자르기

문제 설명

정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.
n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로 올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(n, slicer, num_list):
    answer = []
    a, b, c = slicer[0], slicer[1], slicer[2]
    if n == 1: answer = num_list[0:b+1]
    elif n == 2: answer = num_list[a:]
    elif n == 3: answer = num_list[a:b+1]
    else: answer = num_list[a:b+1:c]
    return answer
a, b, c = slicer

배열 값을 각 변수에 저장하는데 이렇게 간단하게도 할 수 있었다 역시 파이썬 


첫 번째로 나오는 음수

문제 설명

정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.

 

def solution(num_list):    
    answer = [idx for idx, value in enumerate(num_list) if value < 0]
    return answer[0] if answer else -1

리스트 컴프리헨션 표현식은 대괄호로 리스트를 생성해서 바로 정수를 출력하지 못했다

그래서 답이 5이면 [5]로 테스트 실패

근데 어차피 결과값은 1개뿐이니 리스트의 0번째 인덱스를 출력하도록 함!


배열 만들기 3

문제 설명

정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다.intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

 

def solution(arr, intervals):
    a, b = intervals 
    return arr[a[0]:a[1]+1]+arr[b[0]:b[1]+1]

배열 intervals의 꼴은 항상 같으니 배열 하나씩 저장하고 인덱스를 활용하여 풀었다.

def solution(arr, intervals):
    s1, e1 = intervals[0]
    s2, e2 = intervals[1]
    return arr[s1:e1+1] + arr[s2:e2+1]

비슷한 풀이지만 가독성이 더 좋아보이는 코드


2의 영역

문제 설명

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.단, arr에 2가 없는 경우 [-1]을 return 합니다.

def solution(arr):
    answer = []
    idx_range = [idx for idx, value in enumerate(arr) if value == 2]
    min_range = min(idx_range, default=-1)
    max_range = max(idx_range, default=-1)
    
    return arr[min_range:max_range+1] if arr[min_range:max_range+1] else [-1]

배열 안에서 값이 2인 인덱스를 모두 찾고

2인 인덱스의 최소, 최대를 구해서,

최대, 최소 인덱스의 값을 포함한 배열을 리턴하도록 했다.

근데 -1을 깔끔하게 처리하지는 못한 것 같음.

최소, 최대 구할 때 배열이 빈 값이면 ValueError가 나서 기본 값을 임의로 -1로 정해두기도 함. 

def solution(arr):
    if 2 not in arr:
        return [-1]
    return arr[arr.index(2) : len(arr) - arr[::-1].index(2)]​

다른 사람 풀이 :

앞쪽부터 순회해서 값이 2인 인덱스 번호

뒤쪽부터 순회해서 값이 2인 인덱스 번호를 찾아서 슬라이싱

 

arr[::-1].index(2) > 역순 순회해서 인덱스를 구하고,

그 값 전체 길이에서 빼줘야 내가 최종으로 구하는 인덱스 값이 나온다.

len(arr) - arr[::-1].index(2)

 

깔끔하다.. 


배열 조각하기

문제 설명

정수 배열 arr와 query가 주어집니다.query를 순회하면서 다음 작업을 반복합니다.짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(arr, query):
    for i, query in enumerate(query):
        if i % 2 == 0:
            arr = arr[:query+1]
        else:
            arr = arr[query:]
    return arr

며칠 연속으로 리스트, 배열, 문자열 연습하니까 조금씩 감이 오는 것 같다!

쉽지만 쉽지 않은 것들 .. 기초 단계에서 다양한 풀이들을 잘 익히고 넘어가야겠다

오늘도~ 성공~

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