-
묘공단 (코딩 테스트 합격자 되기 파이썬 편)코딩 테스트 합격자 되기 파이썬 편 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 이하의 자연수이다.
- 곱할 수 있는 배열만 주어진다.
arr1arr2return[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)
'코딩 테스트 합격자 되기 파이썬 편' 카테고리의 다른 글
묘공단 (코딩 테스트 합격자 되기 파이썬편) (2) 2024.02.01 묘공단 (코딩 테스트 합격자 되기 파이썬편) (1) 2024.01.26 묘공단 (코딩 테스트 합격자 되기 파이썬편) (0) 2024.01.17