ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 묘공단 (코딩 테스트 합격자 되기 파이썬 편)
    코딩 테스트 합격자 되기 파이썬 편 2024. 1. 10. 23:14

    1. 배열 
     

    1.1  배열 선언 방법

    arr1 = [0, 0, 0, 0, 0, 0] 
    arr2 = [0] * 6 #arr1과 결과값 동일 
    arr3 = lsit(range(6)) #[0, 1, 2, 3, 4, 5] #리스트 컴프리헨션 사용 
    arr4 = [0 for _ in range(6)] #arr1과 결과값 동일

    1.2  배열과 차원

    1) 1차원 배열

    제일 간단한 배열의 형태.

    2) 2차원 배열

    1차원 배열을 좀 더 확장한 형태.

     2-1) 2차원 배열 표현

    arr1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
    print(arr1[2][3]) #12
    arr1[2][3] = 15 
    print(arr1[2][3]) #15
    
    
    리스트 컴프리헨션 사용 
    arr2 = [[i]*4 for _ in range(3)] 
    [[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2]]

    1.3 배열을 선택할 때 고려할 점

    1) 할당할 수 있는 메모리의 크기 확인해야한다.

           배열로 표현하려는 데이터가 너무 많으면 배열 할당에 실패할 수 있음.

     

    2) 중간 데이터 삽입이 많은지 확인 해야한다

          중간이나 처음에 데이터 삽입이 빈번하면 시간 복잡도가 높아짐.

    2. 자주 활용하는 기법

    1) append()메서드로 데이터 추가

     

    lst = [1, 2, 3] lst.append(4) 
    [1, 2, 3, 4]

    2) + 연산자로 데이터 추가

    lst = [1, 2, 3] lst += [4, 5] 
     lst = lst + [4, 5] 
     [1, 2, 3, 4, 5]

     

    3) insert() 메서드로 데이터 삽입

    list_name.insert(데이터를 삽입할 위치, 삽입한 데이터) 
    
    lst = [1, 2, 3] 
    lst.insert(2, 999) [1, 2, 999, 3]

    4) pop() 메서드로 특정 위치의 데이터 삭제

    lst = [1, 2, 3, 4, 5]
    lst.pop(2) #[1, 2, 4, 5]

    pop() 메서드는 팝할 데이터의 인덱스를 인수로 받아 삭제한다.

    5) remove() 메서드로 특정 데이터 삭제

    lst = [1, 2, 3, 2, 4, 5] 
    lst.remove(2) #[1, 3, 2, 4, 5]

    remove() 메서드는 인수로 받은 값이 처음 등장하는 위치의 데이터를 삭제한다.

    6) 리스트 컴프리헨션으로 데이터에 특정 연산 적용

    number = [1, 2, 3, 4, 5]
    squares = [num**2 for num in number] #[1, 4, 9, 16, 25]

     

    리스트 연관 메서드

    • len( ) : 리스트의 전체 데이터 개수를 반환하는 함수
    • index( ) : 특정 데이터가 처음 등장한 인덱스를 반환하는 함수. 없다면 -1을 반환.
    • sort( ) : 사용자가 정한 기준에 따라 리스트 데이터를 정렬하는 메서드
    • count( ) : 특정 데이터의 개수를 반환하는 메서드 

     

    몸풀기 문제

     

    01. 배열 정렬하기

     

    정수 배열을 정렬해서 반환하는 solution() 함수를 완성하세요.

     

    제약 조건

    • 정수 배열의 길이는 2이상 10^5이하
    • 정수 배열의 각 데이터 값은 -100,000 이상 100,000 이하

    입출력의 예

     

    입력 출력
    [1,-5,2,4,3] [-5,1,2,3,4]
    [2,1,1,3,2,5,4] [1,1,2,2,3,4,5]
    [6,1,7] [1,6,7]

     

     

    def solution(arr):
    	arr.sort()
    	print(arr)
    arr = [1,-5,2,4,3]
    solution(arr) # [-5,1,2,3,4]


    02. 배열 제어하기

    정수 배열을 하나 받습니다. 배열의 중복값을 제거하고 배열 데이터를 내림차순으로 정렬해서 반환하는
    solution함수를 구현하세요.

     

    제약 조건

    • 정수 배열의 길이는 2이상 10^5이하
    • 정수 배열의 각 데이터 값은 -100,000 이상 100,000 이하

    입출력의 예

    입력 출력
    [4,2,2,1,3,4] [4,3,2,1]
    [2,1,1,3,2,5,4] [5,4,3,2,1]

     

    def solution(lst):
        unique_list = list(set(lst))
        unique_list.sort(reverse=True)
        print(unique_list)
    lst = [4,2,2,1,3,4]
    solution(lst)

     

     

    03. 두개 뽑아서 더하기

    정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 2개의 수를 뽑아 더해 만들 수 있는 모든 수를 배열에 오름차순으로 담아 반환하는 solution() 함수를 완성하세요.

     

    제약 조건

    • numbers의 길이는 2이상 100 이하
    • numbers의 모든 수는 0 이상 100 이하
    입력 출력
    [2,1,3,4,1] [2,3,4,5,6,7]
    [5,0,2,7] [2,5,7,9,12]
    def solution(numbers):
        lst = []
        for i in range(0, len(numbers)):
            for j in range(i+1, len(numbers)):
                lst.append(numbers[i] + numbers[j])
        lst = sorted(set(lst))
        print(lst)
    numbers = [2,1,3,4,1]
    solution(numbers)

     

    04. 모의고사

    수포자 삼인방은 모의고사에 수학문제를 전부 찍으려 합니다. 수포자는 1번부터 마지막 문제까지 다음과 같이 찍습니다.

    • 1번 수포자가 찍는 방식 : 1,2,3,4,5,1,2,3,4,5,…
    • 2번 수포자가 찍는 방식 : 2,1,2,3,2,4,2,5,2,1,2,3,2,4,2,5,…
    • 3번 수포자가 찍는 방식 : 3,3,1,1,2,2,4,4,5,5,3,3,1,1,2,2,4,4,5,5,…

    1번 문제부터 마지막 문제까지의 정답이 순서대로 저장된 배열 answer가 주어졌을 때 가장 많은 문제를 맞힌 사람이 누군지 배열에 담아 반환하도록 solution() 함수를 작성하세요.

     

    제약 조건

     

    • 시험은 최대 10,000문제로 구성되어 있다.
    • 문제의 정답은 1,2,3,4,5 중 하나이다.
    • 가장 높은 점수를 받은 사람이 여럿이라면 반환하는 값을 오름차순으로 정렬해라
    입력 출력
    [1,2,3,4,5] [1]
    [1,3,2,4,2] [1,2,3]

     

    def solution(answers):
        arr1 = [1,2,3,4,5]
        arr2 = [2,1,2,3,2,4,2,5]
        arr3 = [3,3,1,1,2,2,4,4,5,5]
        student1 = []
        student2 = []
        student3 = []
        highest_student = []
        score1 = 0
        score2 = 0
        score3 = 0
        for i in range(0,len(answers)):
            student1.append(arr1[i%5])
            student2.append(arr2[i%8])
            student3.append(arr3[i%10])
            if student1[i] == answers[i]:
                score1 = score1 + 1
            if student2[i] == answers[i]:
                score2 = score2 + 1
            if student3[i] == answers[i]:
                score3 = score3 + 1
        max_value = max(score1, score2, score3)
        if max_value == score1:
            highest_student.append(1)
            if max_value == score2:
                highest_student.append(2)
                if max_value == score3:
                    highest_student.append(3)
        elif max_value == score2:
            highest_student.append(2)
            if max_value == score3:
                highest_student.append(3)
        elif max_value == score3:
            highest_student.append(3)
        print(highest_student)
    answers = [1,3,2,4,2]
    solution(answers)



    05. 행렬의 곱셈

    2차원 행렬 arr1과 arr2를 입력받아 arr1에 arr2를 곱한 결과를 반환하는 solution() 함수를 완성하세요.


     제약 조건

    • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하이다.
    • 행렬 arr1, arr2의 데이터는 -10이상 20 이하의 자연수이다.
    • 곱할 수 있는 배열만 주어진다.
     
     
    arr1
    arr2
    return
    [1,4],[3,2],[4,1]
    [3,3],[3,3]
    [15,15],[15,15],[15,15]
    [2,3,2],[4,2,4],[3,1,4]
    [5,4,3],[2,4,1],[3,1,1]
    [22,22,11],[36,28,18],[29,20,14]
    def solution(arr1,arr2):
        r1, c1 = len(arr1), len(arr1[0]) # r1 : 열, c1 : 행
        r2, c2 = len(arr2), len(arr2[0]) # r2 : 열, c2 : 행
    
        result = [[0] * c2 for _ in range(r1)]
    
        for i in range(r1):
            for j in range(c2):
                for k in range(c1):
                    result[i][j] += arr1[i][k] * arr2[k][j]
        print(result)
    
    arr1 = [[2,3,2],[4,2,4],[3,1,4]]
    arr2 = [[5,4,3],[2,4,1],[3,1,1]]
    solution(arr1,arr2)

     

     

    06. 실패율

    전체 스테이지의 개수가 N, 게임을 이용하는 사용자가 현재 멈춰 있는 스테이지의 번호가 담긴 배열 stages가 주어질 때 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨 있는 배열을 반환하도록 solution() 함수를 완성하세요.

     

    제약조건

    • 스테이지 개수 N은 1 이상 500 이하의 자연수이다.
    • stages의 길이는 1이상 200,000 이하이다.
    • stages에는 1 이상 N+1 이하의 자연수가 있다.
    • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오면 된다.
    • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0으로 정의한다.
    def solution(N,stages):
        result = []
        fail = []
        max_Search = []
        total = len(stages)
        for i in range(1,N+1):
            fail.append(stages.count(i) / total)
            max_Search.append(stages.count(i) / total)
            total = total - stages.count(i)
        for j in range(0,N):
            max_index = max_Search.index(max(max_Search))
            result.append(max_index + 1)
            max_Search[max_index] = -1
        print(result)
        
    N = 5
    stages = [2,1,2,6,2,4,3,3]
    solution(N,stages)



    07. 방문 길이

    x의 범위 (-5,5) y의 범위 (-5,5)를 벗어나지 않고 중복된 경로를 지나는 경우를 제외하고 게임 캐릭터가 처음 걸어본 길의 길이를 구해 반환하는 solution()을 완성하라

     

    제약 조건

    • dirs는 String형으로 주어지며 ‘U’, ‘D’, ‘R’, ‘L’ 이외에는 주어지지 않는다.
    • dirs의 길이는 500 이하의 자연수이다.

     

    def solution(dirs):
        x, y = 0, 0 # 좌표
        count = 0 # 방문 횟수
        dirs_lst = list(dirs) # dirs의 문자열을 분리하여 리스트에 저장
        dirs_len = len(dirs_lst) # dirs의 길이 
        route = [] # 중복을 찾기위해 x,y의 좌표값과 dirs의 값을 저장하는 리스트
        dup = 0 # 중복된 횟수
        expt = 0 # 중복과 x와 y값이 벗어난 경우가 같은경우 이 값을 더해 해결
        for i in range(dirs_len):
            if dirs_lst[i] == 'U':
                if y < 5:
                    y = y + 1
                    count = count + 1
                else:
                    if expt == 0:
                        expt = 1
                    expt += 1
            elif dirs_lst[i] == 'D':
                if y > -5:
                    y = y - 1
                    count = count + 1
                else:
                    if expt == 0:
                        expt = 1
                    expt += 1
            elif dirs_lst[i] == 'L':
                if x > -5:
                    x = x - 1
                    count = count + 1
                else:
                    if expt == 0:
                        expt = 1
                    expt += 1
            elif dirs_lst[i] == 'R':
                if x < 5:
                    x = x + 1
                    count = count + 1
                else:
                    if expt == 0:
                        expt = 1
                    expt += 1
            route.append([x,y,dirs_lst[i]])
        for i in range(len(route)):
            for j in range(i+1, len(route)):
                if route[i][0] == route[j][0] and route[i][1] == route[j][1] and route[i][2] == route[j][2]:
                    dup += 1
        if expt == 2:
            expt = 1
        count = count - dup + expt
        print(count)
    
    #dirs = "ULURRDLLU"
    dirs = "LULLLLLLU"
    solution(dirs)
Designed by Tistory.