본문 바로가기
  • 머킹이의 머신로그
오늘부터 코딩테스트

[오늘부터 코딩테스트]파이썬으로 프로그래머스 코딩 기초 프로그램 풀기

by 머킹 2023. 10. 6.
728x90

[파이썬] 프로그래머스 Lv0. 첫 번째로 나오는 음수, 배열 만들기 3, 2의 영역, 배열 조각하기

 

안녕하세요 머킹입니다.

오늘 사정이 생겨서 늦어버렸네요.

(노트북을 더 이상 쓸 수 없어서) 피시방에서 열심히 풀고 있습니다.

이것도 나름대로 신선하네요. 언젠간 꼭 좋은 컴퓨터를 사고 싶습니다.

 


첫 번째로 나오는 음수

 

문제 설명

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

음수가 없다면 -1을 return 합니다.

 

def solution(num_list):
    answer = 0
    if num_list < 0:
        return index(num_list)
    else:
        return -1
    return answer

일단 0보다 작은 이라는 조건을 넣어야 할 것 같고,

그리고 그 숫자를 찾아내서 index로 넣어야 할 것 같습니다.

def solution(num_list):
    for i, num in enumerate(num_list):
        if num < 0:
            return i
    return -1
def solution(num_list):
    return -1 if(len(list(filter(lambda x: x<0, num_list))) == 0) else num_list.index(list(filter(lambda x: x<0, num_list))[0])

짧은 코드가 다 좋은 건 아니라고 하지만

lambda 함수를 잘 쓰고 싶은 욕심이 점점 생깁니다.

하지만 기본부터 잘해야겠죠


배열 만들기 3

 

문제 설명

intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다.

닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.

이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

 

이 문제를 한참 동안 이해하고자 했는데

a1, b1의 꼴로 주어지고.. 배열 arr 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열은 어떤 걸까요

입출력 예시를 봐서 조금 이해했는데 제가 생각하는 a2값이 다르더라고요..?!

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

이거는 내일 동료분들께 여쭤봐야겠습니다.

도저히 모르겠어요.

그리고 추가로 제가 이해한 부분들을 마저 적겠습니다.

 

동료분께 여쭤봐서 드디어 알아냈습니다.

제가 intervals를 숫자로 이해해서 그랬더라구요

알고보니까 인덱스, 즉 순서였습니다!!

알고나니 정말 별거 없군요..


2의 영역

 

문제 설명

정수 배열 arr가 주어집니다.

배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, arr에 2가 없는 경우 [-1]을 return 합니다.

 

def solution(arr):
    for i, arr in enumerate(arr):
        if arr == 2:
            return arr[2:2]
    return -1

문제는 완벽하게 이해했습니다.

혹시 조건문이 맞을까요?

아니면 제가 너무 간단하게 썼을지도 모르겠습니다.

구구단의 기억을 살려서 for문 안에 for문을 연속적으로 써보겠습니다.

 

n번째의 시도에도 왜인지 자꾸 오류가 납니다.

자꾸 테스트 4개 중 2개가 틀려버리네요.

def solution(arr):
    first_index = -1
    last_index = -1
    
    for i in range(len(arr)):
        if arr[i] == 2:
            first_index = i
            break
    
    if first_index != -1:
        for i in range(first_index, len(arr)):
            if arr[i] == 2:
                last_index = i
    
    result = []
    
    if first_index == -1:
        result.append(-1)
    elif first_index == last_index:
        result.append(2)
    else:
        result = arr[first_index:last_index+1]
    
    return result

결국 이 코드로 통과했습니다.

진짜 대박인 건 다른 사람들의 코드를 봤는데

제가 너무너무 어렵게 풀었다는 생각이 들었습니다.

문제를 간단하게 생각하는 것도 중요하네요.

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

진짜 아주 간단하지 않나요..

index(2)도 충격이고 정말 놀랍습니다.

 

코드에 대한 설명입니다.

  1. 배열 arr에서 2가 존재하는지 확인합니다. 만약 2가 없다면, 배열에 2가 없는 경우이므로 [-1]을 반환합니다.
  2. 2가 배열에 있는 경우, arr.index(2)를 사용하여 배열에서 2의 첫 번째 등장 인덱스를 찾습니다. 이것은 2가 처음 나타나는 위치를 나타냅니다.
  3. 그다음, arr [::-1]. index(2)를 사용하여 배열을 뒤집어서 2의 첫 번째 등장 인덱스를 찾습니다. 이것은 배열을 뒤집어서 2가 처음으로 나타나는 위치를 나타냅니다. 뒤에서부터 검색하면 배열을 뒤집어도 2의 위치를 정확히 찾을 수 있습니다.
  4. 마지막으로, len(arr) - arr[::-1].index(2)를 사용하여 뒤집은 인덱스를 원래 방향으로 변환합니다. 이것은 뒤집어서 찾은 인덱스를 다시 원래 배열의 인덱스로 변환하여 부분 배열의 끝 인덱스를 나타냅니다.
  5. 이렇게 찾은 첫 번째 2의 인덱스부터 끝까지의 부분 배열을 반환합니다. 이 부분 배열은 주어진 배열에서 2가 모두 포함된 가장 작은 연속된 부분 배열입니다.

 


배열 조각하기

 

문제 설명

정수 배열 arr와 query가 주어집니다.

query를 순회하면서 다음 작업을 반복합니다.

- 짝수 인덱스에서는 arr에서 query [i] 번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.

- 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.

위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

 

와 이 문제 꽤나 복잡한데요?!

결국 번갈아가면서 뒷부분, 앞부분을 잘라야 한다는 소린데위에서 말했듯이 최대한 간단하게 생각해 보겠습니다.

 

def solution(arr, query):
    answer = []
    if arr % 2 == 0:
        return [arr[arr.index(query[i]) - arr[::-1].index(query[i])]
    
    else:
        return [arr[::-1].index(query[i]) - arr[arr.index(query[i])]

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

    return arr

복잡하게 할 필요 없고 arr에서 query의 앞에 뒤에만 바꾸면 되는 부분이었습니다.

더 간단한 코드가 있나 살펴보는데 비슷비슷하네요.