Day7

  • 수열과 구간 쿼리 4
  • 배열 만들기 2
  • 카운트 업
  • 콜라츠 수열 만들기
  • 배열 만들기 4

수열과 구간 쿼리 4

문제 설명

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

def solution(arr, queries):
    for s, e, k in queries:
        for i in range(s, e+1):
            if i % k == 0:
                arr[i] += 1
    return arr

어제 문제랑 비슷해서 손쉽게 푸나 했더니 비슷한듯 다른 문제... 

인덱스 s~e까지 자르는게 아니라 배열은 그대로 가져가되

s~e까지만 반복하고, 그 안에서 i가 k의 배수일 때, 해당하는 배열에만 1을 더했다.


배열 만들기 2

문제 설명

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

 

def solution(l, r):
    answer = []
    Xlist= set(['1','2','3','4','6','7','8','9'])
    for i in range(l, r+1):
        num = set(str(i))
        if num & Xlist:
            pass
        else:
            answer.append(i)
    if not answer:
        answer.append(-1)
    return answer

Xlist와 l~r사이의 숫자 중에 교집합이 있으면(0, 5가 아닌 값이 있으면) pass

교집합이 없으면 (0, 5만 남아있을테니) 그때의 값을 answer에 append하기

def solution(l, r):
    answer = []
    for num in range(l, r + 1):
        if not set(str(num)) - set(['0', '5']):
            answer.append(num)
    return answer if answer else [-1]

다른 사람 풀이:

 if not set(str(num)) - set(['0', '5']): 값을 집합으로 표현하고

집합 - 집합 = 비어있으면 >> 1,2,3,4,6,7,8,9의 값이 없다는 것이니 그때의 값을 배열에 저장

이런 신박한 방법을 어찌 생각해내시는지.....


카운트 업

문제 설명

정수 start_num와 end_num가 주어질 때, start_num부터 end_num까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(start, end):
    answer = []
    for i in range(start, end+1):
        answer.append(i)
    return answer

응? 갑자기 이렇게 쉬운게 나와버린다고? 감사합니다.

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

파이썬은 사기야 .. 코드를 효율적으로 줄여쓰는 연습을 해보자 .....!


콜라츠 수열 만들기

문제 설명

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.
def solution(n):
    answer = [n]
    
    while n != 1:
        if n % 2 == 0:
            n //= 2
        else:
            n = 3 * n + 1
        answer.append(n)
            
    return answer

1. n이 1일 때까지 무한 반복

2. 짝, 홀수일 때 연산다르게 하고, 배열에 값 저장


배열 만들기 4

문제 설명

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

 

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

    return stk

문제 읽으면서 코드썼는데 정답이라 기뻐했는데 if, elif문 실행부분 똑같네 ......요.......ㅎ

정신 몽롱한 상태로 푸는 것은 좋지 않습니다 ...... 그래도 이제 잘 수 있어 기뻐요!

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

while문으로 먼저 조건에 만족하는 원소들을 모두 지운 후,

마지막 남은 원소들 모두 추가. 끝!


 

Day6

  • 마지막 두 원소
  • 수 조작하기 1
  • 수 조작하기 2
  • 수열과 구간 쿼리 3
  • 수열과 구간 쿼리 2

마지막 두 원소

문제 설명

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    if num_list[-1] > num_list[-2]:
        num_list.append(num_list[-1] - num_list[-2])
    else:
        num_list.append(num_list[-1] * 2)

    return num_list

 

def solution(l):
    l.append(l[-1]-l[-2] if l[-1]>l[-2] else l[-1]*2)
    return l

삼항 연산자로 간단하게도 가능


수 조작하기 1

문제 설명

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다."w" : n이 1 커집니다."s" : n이 1 작아집니다."d" : n이 10 커집니다."a" : n이 10 작아집니다.위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

 

def solution(n, control):
    for i in control:
        if i == "w": n += 1
        elif i == "s": n -= 1
        elif i == "d": n += 10
        else: n -= 10
    return n

제일 많은 정석적인.. 풀이? 인듯

def solution(n, control):
    answer = n
    c = { 'w':1, 's':-1, 'd':10, 'a':-10}
    for i in control:
        answer += c[i]
    return answer

딕셔너리를 이용해서 키-값으로 더한 풀이, 신박하다


수 조작하기 2

문제 설명

정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다."w" : 수에 1을 더한다."s" : 수에 1을 뺀다."d" : 수에 10을 더한다."a" : 수에 10을 뺀다.그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(numLog):
    answer = ''
    for i in range(1, len(numLog)):
        if numLog[i-1] + 1 == numLog[i]:
            answer += "w"
        elif numLog[i-1] - 1 == numLog[i]:
            answer += "s"
        elif numLog[i-1] + 10 == numLog[i]:
            answer += "d"
        else:
            answer += "a"
    return answer

전 문제랑 비슷한듯 어려움

나는 현재값 +n이 다음값과 같다면 ~ 이런식으로 해석하고 풀었는데

def solution(numLog):
    answer = ''
    for i in range(1, len(numLog)):
        dif = numLog[i] - numLog[i - 1]
        if dif == 1:
            answer += 'w'
        elif dif == -1:
            answer += 's'
        elif dif == 10:
            answer += 'd'
        elif dif == -10:
            answer += 'a'
        else:
            pass
    return answer​

다른 사람들은 이런식으로 현재값과 이전값의 차이를 이용해서 구한 것 같다.

이런 문제 풀 때, 인덱스에러 나만 많이 나오나.. 주의해가며 풀어야겠다.


수열과 구간 쿼리 3

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
def solution(arr, queries):
    for query in queries:
        for i in range(1, 2):
            j = query[i-1]
            k = query[i]
            arr[j], arr[k] = arr[k], arr[j]
    return arr

중첩 반복문 .. 이런 문제에 쓰면 안된다는 것을 알지만 해결법이 떠오르지 않았어 ㅠ

def solution(arr, queries):
    for a,b in queries:
        arr[a],arr[b]=arr[b],arr[a]
    return arr

다른 사람 풀이:

반복문 이렇게 두 개의 값을 가져올 수 있는지.. 몰랐어요 ~~^^

쿼리 안의 쿼리를 인덱스로 이용해서 리스트 원소 교환


수열과 구간 쿼리 2

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

def solution(arr, queries):
    answer = []
    temp = []
    for s,e,k in queries:
        new_arr = arr[s:e+1]
        temp = [i for i in new_arr if i > k]

        if temp:
            value = min(temp)
            answer.append(value)
        else:
            answer.append(-1)

    return answer

아오 .....어렵다 .....ㅠㅠ 힌트랑 이것저것 도움받고 결국 성공 ...

1. arr 배열을 인덱스 s~e까지 자르기

2. 잘린 배열을 반복문을 통해 k보다 큰 값 찾아서 temp에 넣기

3. temp가 비어있지 않을 때, temp의 최솟값 찾기, 비어있으면 answer은 -1

4. 최솟값을 최종값으로 저장 answer에 담기

5. answer 반환 끝........

 

ㅠㅠ 머리가 굳었나봐요 5문제 푸는 시간이 점점 길어지고 있다 ....... 

오늘은 약 두 시간 반정도 소요 ....

 

+ Recent posts