[python] programmers 이차배열 (1)

도리·2025년 4월 20일

코딩 기초 트레이닝에 있는 배열 문제를 정리해봤다.

배열의 원소만큼 추가하기

https://school.programmers.co.kr/learn/courses/30/lessons/181861

sol1
def solution(arr):
    answer = []
    # 입력된 숫자는 크기만큼 곱하기..? 
    for i in arr:
        num = i
        while(num):
            answer.append(i)
            num -= 1
    return answer

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

sol3
def solution(arr):
    return [i for i in arr for _ in range(i)]

길이에 따른 연산

https://school.programmers.co.kr/learn/courses/30/lessons/181879

sol1
def solution(num_list):
    answer = 0 # 길이가 11이상이면 합 // 길이가 10이하이면 곱
    num = len(num_list)
    
    if num >= 11:
        for i in num_list:
            answer += i

    else:
        answer = 1
        for i in num_list:
            answer *= i
    return answer


sol2
def solution(num_list):
    lennum = len(num_list)
    answer = 0
    if lennum >= 11:
        answer = sum(num_list)
    else:
        answer =1
        for i in num_list:
            answer *= i 
    return answer

부분 문자열 이어 붙여 문자열 만들기

sol1
def solution(my_strings, parts):
    answer = ''
    for i in range(len(my_strings)):
        n , m = parts[i][0], parts[i][1]
        result = ''.join(my_strings[i][n:m+1])
				## result = (my_strings[i][n:m+1]) 해도 됨
        answer += result

                         
    return answer

sol2
def solution(my_strings, parts):
    answer = ""
    for i in range(len(parts)):
        string = my_strings[i]
        p = parts[i]
        answer += str(string[p[0]:p[1]+1])
    

    return answer

sol3
def solution(my_strings, parts):
    return ''.join(s[n:m+1] for s, (n, m) in zip(my_strings, parts))
  • sol1 : join()으로 인한 과잉 연산
    n,m 인덱스 분리
    my_strings 슬라이싱.
  • sol2 : string, parts 지정
    바로 슬라이싱해서 answer에 더함

슬라이싱 결과는 이미 문자열

zip ()을 이용해서 두 리스트를 함께 순회하는 방법도 있다.

⭐️문자열 잘라서 정렬하기⭐️

문자열파트에 있는건데 또 틀렸다.

  • 오답
def solution(myString):
    result = myString.rstrip('x')
    result = result.lstrip('x')
    result = result.split('x')
    
    result.sort()
    
    return result
  • 정답
    if i 이 부분이 중요!! 빈문자 거르기
def solution(myString):
    result = [i for i in myString.split('x') if i]
    result.sort()
    return result

이차원 배열 대각선 순회하기

  • 오답
    • 행렬값이 아닌 인덱스 값의 합이 k 이하여야 한다.
    • 내 코드 : 행렬값이 k 이하인 경우가 되어버림..
def solution(board, k):
    answer = 0
    for i in board:
        for j in i:
            if j <= k:
                answer += j
    return answer
  • 정답
def solution(board, k):
    answer = 0
    for i in range(len(board)):
        for j in range(len(board[i])):
            if i+j <= k :
                answer += board[i][j]
    return answer

특별한 이차원 배열 1

  • [[1, 0, 0], [0, 1, 0], [0, 0, 1]]

  • [
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]
    ]

  • shape 은 (3,3)

def solution(n):
    answer = []
    # 1. for문으로 n개만큼의 list를 담는다. 
    # 2. i == j 일때 1 나머지는 0 
    for i in range(n):
        result = []
        for j in range(n):
            if i == j:
                result.append(1)
            else:
                result.append(0)
        answer.append(result)
    return answer
  • result = [] 를 i에 관한 for문 안에 넣어서 초기화시키는 것이 킥이다.

특별한 이차원 배열 2

def solution(arr):
    answer = 1
    for i in range(len(arr)): #4
      for j in range(len(arr[i])) : #4
        if arr[i][j] != arr[j][i]:
            answer =0
          
    return answer
  • shape = (4,3)

  • len(arr)이라고 하니까, 2차원배열 안에 있는 1차원 배열의 개수가 출력되었다.

  • len(arr[i]) 로 하니까 3이 출력됨.

빈 배열에 추가, 삭제하기

def solution(arr, flag):
    answer = []  # true면 뒤에 arr[i]를 arr[i]*2번 추가. 
                    # false면 arr[i]개 삭제
    for i in range(len(flag)):
        if flag[i]== True:
            for j in range(arr[i]):
                answer.append(arr[i])
                answer.append(arr[i])
        else:
            for j in range(arr[i]):
                answer.pop()
    return answer
  • remove, pop

수열과 구간 쿼리 1

  • 오답
def solution(arr, queries):
    #queries 안에 있는 s <= i <= e 에 값들을 +1 하자.
    for i in queries:
        n,m = queries[i]
        for j in range(n,m+1):
            arr[j] = arr[j]+1
    return arr

틀린 이유 :

  • for i in queries:
    n,m = queries[i] // i 는 queries의 요소가 된다.
    i는 (n,m)로 이뤄져있는데 이걸 또 인덱스로 접근하니까 문제
  • 그냥 for n,m in queries:라고 하면. 된다.
sol1

def solution(arr, queries):
    #queries 안에 있는 s <= i <= e 에 값들을 +1 하자.
    for n,m in queries:
        for j in range(n,m+1):
            arr[j] = arr[j]+1
    return arr
sol2
def solution(arr, queries):
    answer = [] # queries 구간에 있는 값에 +1
    
    for i in queries:
        a = i[0]
        b = i[1]
        for j in range(a,b+1):
            arr[j] += 1
    return arr

⭐️⭐️글자 지우기⭐️⭐️

  • 오답
    • 해결방법 1.문자열을 리스트로 변환해서 pop()
    • 해결방법 2.새 문자열을 만들어서 제외
def solution(my_string, indices):  
    # indices에 해당하는 원소 지우고 이어붙이기!!
    
    indices.sort()
    for i in indices:
        my_string.pop(i)
    return my_string
  • 정답
sol1 # list 변환해서 pop
def solution(my_string, indices):
    my_string = list(my_string)
    indices.sort(reverse=True)  # 뒤에서부터 pop()해야 인덱스 밀림 방지
    for i in indices:
        my_string.pop(i)
    return ''.join(my_string)

sol2 # 새로운 문자열 만들기 
def solution(my_string, indices):
    return ''.join([ch for idx, ch in enumerate(my_string) if idx not in indices])

sol1

  • list으로 변환해서 pop
    • 이렇게 하면 indices.sort(reverse=True)가 반드시 있어야 한다.
    • 안하고 그냥 pop하면 리스트 길이가 줄어들면서 인덱스가 밀림.

sol2

  • enumerate() 쓰면 글자 ch / 인덱스 idx 둘 다 같이 가져올 수 있다.
  • if idx not in indices //

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

findrfind

  • find 문자열 왼쪽부터 검색해서 처음등장하는 인덱스 반환
  • rfind 문자열 오른쪽부터 검색해서 처음등장하는 인덱스 반환
sol1
def solution(myString, pat):
    answer = ''
    myString = myString[::-1]
    pat = pat[::-1] # 거꾸로 만들어서 find하기
    
    pat_index = myString.find(pat)
    answer = myString[pat_index:]
    answer = answer[::-1]
    
    return answer

sol2

1로 만들기

  • 오답
def solution(num_list):
    answer = 0
    # 짝수면 반 나누고 홀수면 1 빼고 반 나누기 
    #모든 원소를 1로 만들기위한 연산횟수 구하기
    a= 1
    for i in num_list:
        while(a):
            if i == 1:
                a=False
            else:
                if i % 2 == 0: 
                    answer += 1
                    i = i//2
                else:
                    answer += 1 
                    i = i-1
                    i = i//2
    return answer
  • 정답
def solution(num_list):
    answer = 0
    # 짝수면 반 나누고 홀수면 1 빼고 반 나누기 
    #모든 원소를 1로 만들기위한 연산횟수 구하기

    for i in num_list:
        while i > 1:
            if i % 2 == 0: 
                answer += 1
                i = i//2
            else:
                answer += 1 
                i = i-1
                i = i//2
    return answer

오답 원인: a=1(True)라는 값이 for문 밖에있다. (변수초기화 ❌)
즉 초기화를 시켜 다음 i 로 넘어가야 하는데 첫번째 계산만 하고 넘어간 것.

cf.또, 굳이 a라는 원소를 넣어서 조건을 만들 필요 없다.
그냥 i>1 인 동안 루프가 돌아가면 되는 것...

2의 영역

def solution(arr):
    answer = []
     #2로 시작해서 2로 끝나기 
     #idea : 2가 있는 Index를 찾기
    
    # 1) arr에 2가 없는 경우 -1 리턴
    for i in arr:
        if i==2:
            a = True
            break
        else:
            a = False
            
    # 2) 조건에 따라 answer반환
    
    if a == False:
        answer.append(-1)
    else:
        start = arr.index(2)
        end = arr[::-1].index(2)
        answer = arr[start:len(arr)-end]

    return answer

find() -> 문자열 / 없으면 -1 반환
index() -> sequence 자료형 / 없으면 valueError

배열 조각하기

def solution(arr, query):
    answer = []
    # 짝수 인덱스 : arr에서 query[i] 뒤부터 인덱스 부분 잘라서 버리기 
    # 홀수 인덱스 : arr에서 query[i] 앞부분 잘라서 버리기
    for idx, i in enumerate(query):
        if idx % 2 ==0:
            arr = arr[:i+1]
        else:
            arr = arr[i:]
    return arr
  • enumerate()함수를 이용하면 쉽다.
profile
인공지능응용학과 졸업예정..

0개의 댓글