Study

[묘공단]파이썬 스터디 2주차

A란 2023. 12. 1. 20:15

이 글은 골든래빗 코딩 테스트 합격자 되기 파이썬 편의 5장 써머리입니다.

배열

배열과 차원
배열은 차원과 무관하게 메모리에 연속할당된다.
 

  • 배열의 효율성

데이터에 접근하기 위한 시간 복잡도는 O(1).
맨뒤에 삽입 O(1)
맨앞에 삽입 O(N)
중간에 삽입 O(N)
 
- 배열 선택시 고려사항
할당가능한 메모리 크기 확인
중간에 데이터 삽입이 많은지 확인
 

  • 리스트 기법

append() : 맨끝에 데이터 추가 ( +연산자로도 데이터 추가 가능)
insert() : 특정위치의 데이터 삽입
pop() : 특정위치의 데이터 삭제
remove() : 특정 데이터 자체를 삭제하는 함수
len() : 데이터 개수
index() : 인덱스를 반환, 없으면 -1 반환
sort() : 정렬
count() : 특정데이터 개수
 

1. 배열 정렬

 sort 함수 & sorted 함수

  • sort와 sorted 함수 차이** iterable : list, dict, set, str, bytes, tuple, range
  • sort는 리스트형의 메서드로 원본을 수정해서 반환. list에서만 사용 가능. 메모리 사용을 최소화 하고 싶을 때 효과적. sorted는 내장 함수로 원본은 그대로 정렬된 새 리스트(list 효과)를 반환. 다른 iterable에도 사용하고 싶을 때
def solution(arr) : 
	return sort(list((arr)))

def solution(arr) :
	return sorted((arr))
#sorted 내장함수는 정렬된 새 리스트를 반환하기에 list를 사용x.

 

2. 배열 중복 제거 & 정렬

set 함수

  • 중복 제거 : 중복을 제거하는데 효과적.집합 연산 : 합집합, 교집합 같은 집합 연산에 자주 사용.
  • 따라서 sort함수를 사용할 경우, set함수로 중복을 제거 후, 순서가 있는 list를 사용 하여 sort함수로 정렬함.
  • 순서 없음 : 순서가 중요하지 않을 때 사용.
  • set함수는 반복 가능하고, 가변적이며, 중복 요소가 없지만 정렬되어 있지 않은 컬렉션 데이터 타입이다.

핵심 : 파이썬엔 코딩테스트에 유용한 함수가 많으므로 직접 작성하려 하지마라. 

def solution(arr) :
	return sorted(set(arr), reverse = True)
#sorted 내장함수는 정렬된 새 리스트를 반환하기에 list를 사용x 가능.

def solution(arr) : 
	return sort(list(set(arr)), reverse = True)

 

3. 두 개 뽑아서 더하기

#A.
def solution (numbers):
	ans = []
    for i in range(len(numbers)):
		for j in ranger(i+1, len(numbers)):	#서로 다른 두 수
			ans.append(numbers[i]+ number[j])
	return sorted(set(ans))

#B.
def solution (numbers):
	sorted(numbers)
	ans = []
	for i in range(len(numbers)):
    	for j in ranger(i+1, len(numbers)):
			ans.append(numbers[i]+ number[j])
	return list(set(ans))

 

(프로그래머스 문제)

4. 모의고사

def solution(answers):
    answer = []  # 정답 배열
    s1 = [1, 2, 3, 4, 5]
    s2 = [2, 1, 2, 3, 2, 4, 2, 5]
    s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    count = [0, 0, 0] #문제수 저장

    for i in range(len(answers)): # 각 수포자의 답안 패턴을 반복하여 현재 문제와 비교
        if s1[i % len(s1)] == answers[i]:
            count[0] += 1
        if s2[i % len(s2)] == answers[i]:
            count[1] += 1
        if s3[i % len(s3)] == answers[i]:
            count[2] += 1

    maxScore = max(count)
    for i in range(len(count)):
        if count[i] == maxScore:
            answer.append(i + 1) #수포자 번호 1부터 시작

    return answer

 
enumerate 내장함수로 더 쉽고, 간단하게 짜는 법이 있었다. 이번 챕터 책의 의도가 파이썬의 내장함수를 사용하자 인데, 그러지 못한 부분이 매우 아쉬움.. 문제를 풀면서 항상 좀 더 효율적인 쪽을 고민해 봐야할듯.

  • enumerate 활용

- enumerate 함수는 순서가 있는 자료형을 입력받아, 인덱스와 값을 포함하는 enumerate 객체를 반환.
- 인덱스와 값에 쉽게 접근 가능.
 
** n차원 리스트나 튜플 루프에서 더욱 유용하게 사용.

더보기

 

def solution(answers):
    s = [[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    counts = [0, 0, 0]

    for i, answer in enumerate(answers):
        for j, sn in enumerate(s):
            if answer == sn[i % len(sn)]:
                counts[j] += 1

    max_score = max(counts)
    high_scores = [i + 1 for i, count in enumerate(counts) if count == max_score]
    
    return high_scores

5. 행렬의 곱셈

def solution(arr1, arr2):
    answer = []

    # 행렬 곱셈 수행
    for i in range(len(arr1)):
        row = []
        for j in range(len(arr2[0])):
            # 각 원소의 곱셈 결과 계산
            element = sum(arr1[i][k] * arr2[k][j] for k in range(len(arr1[0])))
            row.append(element)
        answer.append(row)

    return answer

 
 

6. 실패율

def solution(N, stages):
    answer = []

    # 각 스테이지의 실패율을 계산하여 리스트에 저장
    fail_rates = []
    total_users = len(stages)

    for stage in range(1, N+1):
        # 현재 스테이지에 도달한 사용자 수
        cur_users = stages.count(stage)

        # 실패율 계산
        if total_users == 0:
            fail_rate = 0
        else:
            fail_rate = cur_users / total_users

        # 실패율과 스테이지 번호 저장
        fail_rates.append((stage, fail_rate))

        # 해당 스테이지까지 도달한 사용자 수 갱신
        total_users -= cur_users

    fail_rates.sort(key=lambda x: x[1], reverse=True)
    answer = [stage for stage, _ in fail_rates]

    return answer

 

7. 방문 길이

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

def solution(dirs):
    visited = set()  # 방문한 좌표를 저장할 집합
    current = (0, 0)  # 현재 위치
    answer = 0

    for move in dirs:
        x, y = current

        # 다음 위치 계산
        if move == 'U':
            next_pos = (x, y + 1)
        elif move == 'D':
            next_pos = (x, y - 1)
        elif move == 'R':
            next_pos = (x + 1, y)
        elif move == 'L':
            next_pos = (x - 1, y)

        # 처음 방문 길
        if -5 <= next_pos[0] <= 5 and -5 <= next_pos[1] <= 5 and (current, next_pos) not in visited:
            visited.add((current, next_pos))
            visited.add((next_pos, current))  # 양방향으로 저장
            answer += 1

        # 다음 위치를 현재 위치로
        current = next_pos

    return answer