728x90
반응형
SMALL

이동 관련 함수

  1. turtle.forward(distance): 앞으로 이동
  2. turtle.backward(distance): 뒤로 이동
  3. turtle.right(angle): 시계 방향 회전
  4. turtle.left(angle): 반시계 방향 회전
  5. turtle.goto(x, y): 특정 좌표로 이동
  6. turtle.setx(x): x축 좌표 설정
  7. turtle.sety(y): y축 좌표 설정
  8. turtle.setheading(angle): 거북이의 방향 설정
  9. turtle.home(): 시작점으로 돌아감
  10. turtle.circle(radius, extent=None, steps=None): 원 또는 호 그리기
  11. turtle.setpos(x, y): 좌표 설정 (goto와 동일)
  12. turtle.setposition(x, y): 좌표 설정 (goto와 동일)
  13. turtle.towards(x, y): 특정 좌표로 가는 각도 반환
  14. turtle.xcor(): 현재 x좌표 반환
  15. turtle.ycor(): 현재 y좌표 반환
  16. turtle.distance(x, y): 특정 좌표까지의 거리 반환
  17. turtle.shearfactor(shear=None): 기울기 설정 및 반환
  18. turtle.seth(angle): 방향을 특정 각도로 설정
  19. turtle.get_shapepoly(): 현재 모양의 다각형 좌표 반환
  20. turtle.settiltangle(angle): 거북이 모양의 기울기 각도 설정

그리기 관련 함수

  1. turtle.pendown(): 선 그리기 시작
  2. turtle.penup(): 선 그리기 중지
  3. turtle.pensize(width): 선의 두께 설정
  4. turtle.pencolor(color): 선 색상 설정
  5. turtle.fillcolor(color): 채우기 색상 설정
  6. turtle.begin_fill(): 도형 채우기 시작
  7. turtle.end_fill(): 도형 채우기 끝
  8. turtle.dot(size=None, color=None): 점 그리기
  9. turtle.write(arg, move=False, align='left', font=('Arial', 8, 'normal')): 텍스트 쓰기
  10. turtle.stamp(): 현재 거북이 모양을 도장처럼 찍음
  11. turtle.begin_poly(): 다각형 그리기 시작
  12. turtle.end_poly(): 다각형 그리기 끝
  13. turtle.get_poly(): 현재 그려진 다각형 반환
  14. turtle.filling(): 현재 채우기 모드 상태 확인
  15. turtle.clearstamp(stampid): 특정 도장 지우기
  16. turtle.clearstamps(n=None): n개 또는 모든 도장 지우기
  17. turtle.ondrag(fun, btn=1): 드래그 이벤트 처리
  18. turtle.onclick(fun, btn=1): 클릭 이벤트 처리
  19. turtle.onrelease(fun, btn=1): 클릭 해제 이벤트 처리
  20. turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None): 거북이 크기 설정
  21. turtle.resizemode(rmode): 리사이즈 모드 설정
  22. turtle.tilt(angle): 거북이 모양 기울기 설정
  23. turtle.tiltangle(angle=None): 기울기 각도 설정/반환
  24. turtle.getpen(): 현재 펜 객체 반환
  25. turtle.getscreen(): 현재 화면 객체 반환
  26. turtle.colormode(cmode=None): 색상 모드 설정 (1.0 또는 255)
  27. turtle.getcanvas(): Tkinter 캔버스 객체 반환
  28. turtle.fill(True/False): 채우기 여부 설정

상태 관련 함수

  1. turtle.speed(speed): 거북이 속도 설정
  2. turtle.position(): 현재 좌표 반환
  3. turtle.heading(): 현재 방향 반환
  4. turtle.xcor(): x 좌표 반환
  5. turtle.ycor(): y 좌표 반환
  6. turtle.distance(x, y): 특정 좌표까지의 거리 계산
  7. turtle.isdown(): 펜이 내려갔는지 여부 확인
  8. turtle.isvisible(): 거북이가 보이는지 확인
  9. turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None): 거북이 크기 설정
  10. turtle.degrees(): 각도 단위를 도로 설정
  11. turtle.radians(): 각도 단위를 라디안으로 설정
  12. turtle.tiltangle(angle=None): 기울기 각도 설정 및 반환
  13. turtle.write_docstringdict(): 함수의 docstring 사전 저장
  14. turtle.ondrag(fun, btn=1): 드래그 이벤트 설정
  15. turtle.delay(): 터틀 움직임 지연 시간 설정 및 반환

모양 관련 함수

  1. turtle.shape(name): 거북이 모양 설정 ('arrow', 'turtle', 'circle', 'square', 'triangle', 'classic')
  2. turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None): 모양의 크기 조절
  3. turtle.get_shapepoly(): 현재 모양의 다각형 좌표 반환
  4. turtle.fillcolor(color): 도형의 채우기 색상 설정
  5. turtle.shape(name): 거북이의 모양 설정
  6. turtle.stamp(): 거북이 모양을 도장처럼 찍음
  7. turtle.clearstamp(stampid): 특정 도장 지우기
  8. turtle.clearstamps(n=None): n개 또는 모든 도장 지우기
  9. turtle.tilt(angle): 거북이 모양 회전
  10. turtle.tiltangle(angle): 기울기 각도 설정 및 반환
  11. turtle.get_shapepoly(): 현재 모양의 다각형 좌표 반환
  12. turtle.fill(True/False): 도형 채우기 여부 설정

화면 관련 함수

  1. turtle.bgcolor(color): 배경 색상 설정
  2. turtle.bgpic(picname): 배경 이미지 설정
  3. turtle.clear(): 화면의 그림 지우기
  4. turtle.clearscreen(): 화면 전체 초기화
  5. turtle.reset(): 모든 설정 초기화
  6. turtle.hideturtle(): 거북이 숨기기
  7. turtle.showturtle(): 거북이 보이기
  8. turtle.tracer(n=None, delay=None): 애니메이션 속도 조절
  9. turtle.update(): 화면 업데이트
  10. turtle.screensize(canvwidth=None, canvheight=None): 화면 크기 설정
  11. turtle.setup(width=0.5, height=0.75, startx=None, starty=None): 화면 창의 크기 설정
  12. turtle.title(title): 창 제목 설정
  13. turtle.window_width(): 창의 너비 반환
  14. turtle.window_height(): 창의 높이 반환
  15. turtle.delay(): 움직임 지연 설정
  16. turtle.exitonclick(): 클릭 시 창 닫기
  17. turtle.listen(): 이벤트 리스너 활성화
  18. turtle.mainloop(): 이벤트 루프 실행

이벤트 처리 및 기타 함수

  1. turtle.onclick(fun, btn=1): 클릭 이벤트 처리
  2. turtle.ondrag(fun, btn=1): 드래그 이벤트 처리
  3. turtle.onrelease(fun, btn=1): 마우스 버튼 해제 이벤트 처리
  4. turtle.onkey(fun, key): 특정 키보드 이벤트 처리
  5. turtle.listen(): 이벤트 리스너 활성화
  6. turtle.delay(delay=None): 애니메이션 지연 시간 설정
  7. turtle.bye(): 창 닫기
  8. turtle.mode(mode=None): 거북이 모드 설정 ('standard', 'logo')
  9. turtle.colormode(cmode=None): 색상 모드 설정 (1.0 또는 255)
  10. turtle.getcanvas(): Tkinter Canvas 객체 가져오기
  11. turtle.getshapes(): 사용할 수 있는 모든 모양 리스트 가져오기
  12. turtle.shearfactor(shear=None): 기울기 설정 및 반환
728x90
반응형
LIST
728x90
반응형
SMALL

아래와 같이 만들 가상환경의 이름과 파이썬 버전이 포함된 명령어를 입력한다.

 

conda create --name [가상환경이름] python=[파이썬버전]

 

아래 명령어를 이용하여 만들어진 가상환경을 확인할 수 있다.

 

conda info --envs

 

 

다음으로 만들어진 가상환경을 사용해보자. 

위에 리스트는 base 가장 기본 환경으로서 명령 프롬프트 앞에 (base) 가 현재 환경을 의미한다.

 

아래 명령어를 이용하여 만들어진 가상환경으로 이동하여 보자

 

conda activate [가상환경이름]

 

 

 

(py37) 로 환경이 이동된 것을 확인할 수 있다.

 

다음으로 base 환경으로 돌아와서 환경을 삭제해보자.

 

conda activate base   "base 환경으로 돌아가는 명령어"

conda remove --name [가상환경이름] --all

 

 

위와 같이 삭제 명령어 입력후 설치된 패키지도 함께 삭제할 것인지 물어본다. y 를 입력하고 깨끗하게 삭제하자.

 

 

완료 후 환경 리스트 명령어로 다시 확인하면 환경(py37)이 삭제된 것을 확인할 수 있다.

728x90
반응형
LIST
728x90
반응형
SMALL
# 원본 리스트 (내부에 리스트가 포함됨)
original_list = [1, [2, 3], 4]

# 깊은 복사 함수 정의
def deep_copy(obj):
    if isinstance(obj, list):
        # 리스트의 경우 요소를 새 리스트로 복사
        new_list = []
        for item in obj:
            new_list.append(deep_copy(item))  # 재귀적으로 요소를 복사
        return new_list
    else:
        # 리스트가 아닌 경우 (기본 자료형 등), 그대로 반환
        return obj

# 깊은 복사 수행
deep_copy_list = deep_copy(original_list)

# 원본과 복사본 출력
print("Original list:", original_list)
print("Deep copy:", deep_copy_list)

# 리스트 요소 변경 (깊이 1)
original_list[1][0] = 'A'

# 변경 후 출력
print("After deep copy, original list:", original_list)
print("After deep copy, deep copy:", deep_copy_list)

결과 설명:

  • deep_copy() 함수는 재귀적으로 리스트의 요소를 탐색하면서 모든 요소를 새로운 객체로 복사합니다.
  • 이 함수는 리스트를 인자로 받고, 리스트 내부의 모든 요소가 기본 자료형이 될 때까지 재귀적으로 호출하여 복사를 수행합니다.
  • original_list의 [2, 3] 부분은 새로운 리스트로 복사되어 deep_copy_list와 독립적인 객체가 됩니다.
  • 따라서 original_list를 변경해도 deep_copy_list에는 어떠한 영향도 미치지 않습니다.

실행 결과:

Original list: [1, [2, 3], 4]
Deep copy: [1, [2, 3], 4]
After deep copy, original list: [1, ['A', 3], 4]
After deep copy, deep copy: [1, [2, 3], 4]

이 예제에서는 copy 모듈을 사용하지 않고도 깊은 복사를 수행하는 간단한 방법을 구현했습니다. 하지만 파이썬의 copy.deepcopy() 함수는 이러한 복잡한 작업을 대신 처리해 주기 때문에 실제 프로덕션 환경에서는 copy 모듈을 사용하는 것이 좋습니다.

728x90
반응형
LIST
728x90
반응형
SMALL

파이썬에서 객체를 복사할 때 얕은 복사(shallow copy)와 깊은 복사(deep copy)의 개념이 중요합니다. 이 두 가지 복사 방법은 객체의 중첩 구조와 상호작용 방식에 따라 다릅니다.

 

얕은 복사 (Shallow Copy)

얕은 복사는 객체를 복사할 때, 원본 객체의 요소들을 새로운 객체에 복사하지만, 요소들이 참조하는 객체들은 원본과 동일한 객체를 참조합니다. 즉, 복사된 객체와 원본 객체는 같은 객체를 공유하게 됩니다.

파이썬에서는 copy 모듈의 copy() 함수나 객체의 copy() 메서드를 사용하여 얕은 복사를 수행할 수 있습니다.

 

import copy

# 원본 리스트
original_list = [1, [2, 3], 4]

# 얕은 복사
shallow_copy = copy.copy(original_list)

# 원본과 복사본 출력
print("Original list:", original_list)
print("Shallow copy:", shallow_copy)

# 리스트 요소 변경 (깊이 1)
original_list[1][0] = 'A'

# 변경 후 출력
print("After shallow copy, original list:", original_list)
print("After shallow copy, shallow copy:", shallow_copy)

결과 설명:

  • original_list는 [1, [2, 3], 4]로 초기화됩니다.
  • shallow_copy는 copy.copy(original_list)를 통해 얕은 복사가 수행됩니다.
  • original_list의 두 번째 요소인 [2, 3]는 내부 리스트입니다.
  • original_list[1][0]을 'A'로 변경하면, original_list와 shallow_copy 모두에 영향을 미칩니다.
  • 이는 얕은 복사에서는 내부 리스트가 동일한 객체를 참조하기 때문에 발생하는 현상입니다.

실행 결과:

Original list: [1, [2, 3], 4]
Shallow copy: [1, [2, 3], 4]
After shallow copy, original list: [1, ['A', 3], 4]
After shallow copy, shallow copy: [1, ['A', 3], 4]

 

깊은 복사 (Deep Copy)

깊은 복사는 객체와 그 객체가 참조하는 모든 객체들까지 완전히 새로운 객체로 복사하는 방법입니다. 따라서 원본 객체와 복사된 객체는 완전히 독립적인 객체가 됩니다.

깊은 복사는 copy 모듈의 deepcopy() 함수나 객체의 copy.deepcopy() 메서드를 사용하여 수행할 수 있습니다.

 

import copy

# 원본 리스트
original_list = [1, [2, 3], 4]

# 깊은 복사
deep_copy = copy.deepcopy(original_list)

# 원본과 복사본 출력
print("Original list:", original_list)
print("Deep copy:", deep_copy)

# 리스트 요소 변경 (깊이 1)
original_list[1][0] = 'A'

# 변경 후 출력
print("After deep copy, original list:", original_list)
print("After deep copy, deep copy:", deep_copy)

결과 설명:

  • original_list는 [1, [2, 3], 4]로 초기화됩니다.
  • deep_copy는 copy.deepcopy(original_list)를 통해 깊은 복사가 수행됩니다.
  • original_list[1][0]을 'A'로 변경하더라도, deep_copy에는 어떠한 영향도 미치지 않습니다.
  • 이는 깊은 복사에서는 내부 리스트까지 새로운 객체로 복사하기 때문에 발생하는 현상입니다.

실행 결과:

Original list: [1, [2, 3], 4]
Deep copy: [1, [2, 3], 4]
After deep copy, original list: [1, ['A', 3], 4]
After deep copy, deep copy: [1, [2, 3], 4]

요약

  • 얕은 복사는 객체의 내용을 새로운 객체에 복사하지만, 내부 객체들은 원본과 동일한 객체를 참조합니다.
  • 깊은 복사는 객체와 그 객체가 참조하는 모든 객체들까지 새로운 객체로 복사하여 완전히 독립적인 복사본을 생성합니다.
  • 객체의 중첩 구조가 복잡할 때는 깊은 복사를 사용하여 예기치 않은 부작용을 방지하는 것이 좋습니다.
728x90
반응형
LIST
728x90
반응형
SMALL

파이썬에서 리스트 슬라이싱(slicing)은 리스트의 부분 집합을 추출하는 강력하고 유연한 방법입니다. 리스트 슬라이스는 다음과 같은 문법을 따릅니다:

 

list[start:end:step]

여기서 각 부분은 다음과 같습니다:

  • start: 슬라이스의 시작 인덱스입니다. 이 위치의 요소는 포함됩니다.
  • end: 슬라이스의 종료 인덱스입니다. 이 위치의 요소는 포함되지 않습니다.
  • step (선택적): 슬라이스에서 요소를 가져오는 간격입니다. 기본값은 1입니다.

 

이제 몇 가지 예제를 통해 리스트 슬라이싱을 살펴보겠습니다.

예제 1: 기본적인 슬라이스

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 인덱스 2부터 5까지 (인덱스 5는 포함되지 않음)
slice1 = my_list[2:5]
print(slice1)  # 출력: [3, 4, 5]

my_list[2:5]는 인덱스 2부터 4까지의 요소를 포함합니다. 즉, [3, 4, 5]가 출력됩니다.

 

 

예제 2: 음수 인덱스 사용

음수 인덱스는 리스트의 끝에서부터 요소를 나타냅니다.

 

# 끝에서 4번째 요소부터 끝까지
slice2 = my_list[-4:]
print(slice2)  # 출력: [7, 8, 9, 10]

my_list[-4:]는 끝에서 4번째 요소부터 끝까지의 요소를 포함합니다. 따라서 [7, 8, 9, 10]이 출력됩니다.

 

예제 3: 간격(step) 사용

간격을 설정하여 일정한 간격으로 요소를 가져올 수 있습니다.

# 인덱스 1부터 8까지, 2씩 건너뛰기
slice3 = my_list[1:8:2]
print(slice3)  # 출력: [2, 4, 6, 8]

my_list[1:8:2]는 인덱스 1부터 7까지의 요소를 2씩 건너뛰며 가져옵니다. 따라서 [2, 4, 6, 8]이 출력됩니다.

 

예제 4: 리스트 전체 복사

슬라이스를 사용하여 리스트 전체를 복사할 수도 있습니다.

# 리스트 전체 복사
copy_of_list = my_list[:]
print(copy_of_list)  # 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

my_list[:]는 리스트 전체를 복사하여 새로운 리스트를 생성합니다. 따라서 my_list와 동일한 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]이 출력됩니다.

728x90
반응형
LIST
728x90
반응형
SMALL

 

문제 설명

실패율

 

슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.

이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.

실패율은 다음과 같이 정의한다.

스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

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

제한사항

스테이지의 개수 N1이상500이하의 자연수이다.

stages의 길이는1이상200,000이하이다.

stages에는1이상N + 1이하의 자연수가 담겨있다.

각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.

,N + 1은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.

만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.

스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은0으로 정의한다.

입출력 예

N stages result
5 [2, 1, 2, 6, 2, 4, 3, 3] [3,4,2,1,5]
4 [4,4,4,4,4] [4,1,2,3]

입출력 예 설명

입출력 예 #1
1번 스테이지에는 총 8명의 사용자가 도전했으며, 이 중 1명의 사용자가 아직 클리어하지 못했다. 따라서 1번 스테이지의 실패율은 다음과 같다.

1 번 스테이지 실패율 : 1/8

2번 스테이지에는 총 7명의 사용자가 도전했으며, 이 중 3명의 사용자가 아직 클리어하지 못했다. 따라서 2번 스테이지의 실패율은 다음과 같다.

2 번 스테이지 실패율 : 3/7

마찬가지로 나머지 스테이지의 실패율은 다음과 같다.

3 번 스테이지 실패율 : 2/4

4번 스테이지 실패율 : 1/2

5번 스테이지 실패율 : 0/1

각 스테이지의 번호를 실패율의 내림차순으로 정렬하면 다음과 같다.

[3,4,2,1,5]

입출력 예 #2

모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.

[4,1,2,3]

============================================================================================문제 풀이

코드는 간단하게 각 스페이지 별로 실패율을 계산한후 정렬을 수행하면 된다.

이때 시간초과로 인한 실패가 많은데 해결하기 위해서는 더이상 플레이어가 없을때(n==0)는 계산 없이 바로 실패율을 0으로 만든다.

def solution(N, stages):
    answer = []
    n = len(stages)
    
    for i in range(N):
        if n==0:#플레이어가 없을때 계산없이 0으로 추가함
            answer.append(0)    
        else:
            c = stages.count(i+1)
            answer.append(c/n)
            n -= c

    answer = sorted(range(1,N+1), key=lambda k: answer[k-1], reverse=True)
    
    
    return answer

 

실행결과

테스트 1 통과 (0.01ms, 9.99MB)
테스트 2 통과 (0.26ms, 10.1MB)
테스트 3 통과 (80.91ms, 10.2MB)
테스트 4 〉 통과 (434.18ms, 10.7MB)
테스트 5 〉 통과 (1687.00ms, 15.1MB)
테스트 6 통과 (0.83ms, 10.4MB)
테스트 7 통과 (11.96ms, 10.3MB)
테스트 8 〉 통과 (385.14ms, 10.8MB)
테스트 9 〉 통과 (1593.72ms, 14.9MB)
테스트 10 〉 통과 (149.76ms, 10.9MB)
테스트 11 〉 통과 (444.06ms, 10.8MB)
테스트 12 〉 통과 (450.53ms, 11.1MB)
테스트 13 〉 통과 (514.34ms, 11.3MB)
테스트 14 통과 (0.04ms, 10.1MB)
테스트 15 통과 (13.92ms, 10.7MB)
테스트 16 통과 (5.73ms, 10.4MB)
테스트 17 통과 (17.65ms, 10.5MB)
테스트 18 통과 (6.00ms, 10.3MB)
테스트 19 통과 (1.26ms, 10.2MB)
테스트 20 통과 (20.84ms, 10.4MB)
테스트 21 통과 (18.46ms, 10.8MB)
테스트 22 〉 통과 (1373.85ms, 18.3MB)
테스트 23 통과 (10.45ms, 11.6MB)
테스트 24 통과 (62.01ms, 11.6MB)
테스트 25 통과 (0.01ms, 10.2MB)
테스트 26 통과 (0.01ms, 10.1MB)
테스트 27 통과 (0.01ms, 10.1MB)

 

테스트 3, 4, 8, 9 등 몇몇 테스트의 경우 큰 시간이 필요하다. 그래서 좀 더 효율적으로 시간을 줄이기 위해서 아래와 같이 count() 함수를 사용하지 않고 미리 계산된 결과만 불러오도록 수정하였다.

def solution(N, stages):
    answer = []
    n = len(stages)
    
    temp =[0]*N #count 를 미리 계산
    
    for v in stages:
        if v<=N:
            temp[v-1] += 1
        
    for i in range(N):
        if n==0:
            answer.append(0)    
        else:
            c = temp[i] # count 값만 호출함
            answer.append(c/n)
            n -= c
            
    answer = sorted(range(1,N+1), key=lambda k: answer[k-1], reverse=True)#리스트 인덱스 정렬
    
    return answer

 

실행결과: 아래와 같이 시간이 많이 단축됨을 확인할 수 있다.

테스트 1 통과 (0.01ms, 10.1MB)
테스트 2 통과 (0.18ms, 10.1MB)
테스트 3 통과 (1.14ms, 10.3MB)
테스트 4 〉 통과 (9.74ms, 10.8MB)
테스트 5 〉 통과 (20.49ms, 14.8MB)
테스트 6 통과 (0.12ms, 10.3MB)
테스트 7 통과 (0.84ms, 10.3MB)
테스트 8 〉 통과 (9.54ms, 10.8MB)
테스트 9 〉 통과 (20.53ms, 15MB)
테스트 10 〉 통과 (10.58ms, 10.8MB)
테스트 11 〉 통과 (9.36ms, 10.9MB)
테스트 12 〉 통과 (14.67ms, 11.3MB)
테스트 13 〉 통과 (20.32ms, 11.3MB)
테스트 14 통과 (0.02ms, 10.2MB)
테스트 15 통과 (4.08ms, 10.5MB)
테스트 16 통과 (3.23ms, 10.3MB)
테스트 17 통과 (6.43ms, 10.4MB)
테스트 18 통과 (3.26ms, 10.4MB)
테스트 19 통과 (0.64ms, 10.2MB)
테스트 20 통과 (5.68ms, 10.3MB)
테스트 21 통과 (19.67ms, 10.8MB)
테스트 22 〉 통과 (21.01ms, 18.3MB)
테스트 23 통과 (19.02ms, 11.7MB)
테스트 24 통과 (18.49ms, 11.6MB)
테스트 25 통과 (0.01ms, 10.1MB)
테스트 26 통과 (0.01ms, 10.1MB)
테스트 27 통과 (0.01ms, 10.1MB)

 

dictionary가 list 보다 데이터 접근이 빠르다고 하여 아래와같이  answer 타입을 list 에서 dictionary 로 변경하여 속도를 확인하였다.

def solution(N, stages):
    answer = {}
    n = len(stages)
    
    temp =[0]*N
    
    for v in stages:
        if v<=N:
            temp[v-1] += 1
        
    for i in range(N):
        if n==0:
            answer[i+1]= 0
        else:
            c = temp[i]
            answer[i+1]= c/n
            n -= c
    
    answer = sorted(answer, key=lambda k: answer[k], reverse=True)
    
    return answer

 

실행결과: 처리 과정은 저장후 정렬이 대부분이며, 저장된 데이터를 찾는 경우가 작다.  그래서 아래와 같이 결과가 비슷하거나 데이터에 따라 약간 차이가 있음을 확인할 수 있다.

 

테스트 1 통과 (0.01ms, 10MB)
테스트 2 통과 (0.15ms, 10.1MB)
테스트 3 〉 통과 (1.15ms, 10.3MB)
테스트 4 〉 통과 (9.34ms, 10.6MB)
테스트 5 〉 통과 (19.32ms, 14.9MB)
테스트 6 통과 (0.12ms, 10MB)
테스트 7 통과 (0.84ms, 10.1MB)
테스트 8 〉 통과 (20.18ms, 10.8MB)
테스트 9 〉 통과 (26.80ms, 15MB)
테스트 10 〉 통과 (9.72ms, 10.8MB)
테스트 11 〉 통과 (9.18ms, 10.7MB)
테스트 12 〉 통과 (14.10ms, 11.2MB)
테스트 13 〉 통과 (14.87ms, 11.3MB)
테스트 14 통과 (0.02ms, 10.1MB)
테스트 15 통과 (4.09ms, 10.4MB)
테스트 16 통과 (3.32ms, 10.4MB)
테스트 17 통과 (6.58ms, 10.6MB)
테스트 18 통과 (3.43ms, 10.4MB)
테스트 19 통과 (0.64ms, 10.2MB)
테스트 20 통과 (4.54ms, 10.2MB)
테스트 21 통과 (9.27ms, 10.9MB)
테스트 22 〉 통과 (20.93ms, 18.2MB)
테스트 23 통과 (20.16ms, 11.6MB)
테스트 24 통과 (18.51ms, 11.5MB)
테스트 25 통과 (0.01ms, 10.2MB)
테스트 26 통과 (0.01ms, 10MB)
테스트 27 통과 (0.01ms, 10.1MB)

 

728x90
반응형
LIST
728x90
반응형
SMALL

정렬시 key  를 사용하여 원하는 기준으로 정렬할 수 있음

 

1) 절대값으로 정렬

a = [-2, -5, 3, 1, -10]

a.sort(key=abs)
print(a)
a = [-2, -5, 3, 1, -10]

b = sorted(a, key=abs)
print(b)

 - 실행결과

[1, -2, 3, -5, -10]

 

2) lambda 를 사용하여 정렬

a = [-2, -5, 3, 1, -10]

a.sort(key=lambda x: -(x*2))
print(a)
a = [-2, -5, 3, 1, -10]

b = sorted(a,key=lambda x: -(x*2))
print(b)

 

각 값들이 -(x*2) 가 적용되어 [4, 10, -6, -2, 20] 로 되고 다시 오름차순으로 정렬되어 아래와 같이 실행결과가 나타남

 

- 실행결과

[3, 1, -2, -5, -10]

 

3) 사용자 정의 객체 리스트를 속성에 따라 정렬하기

 

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person("Alice", 25), Person("Bob", 30), Person("Charlie", 20)]
sorted_people = sorted(people, key=lambda x: x.age)
print([person.name for person in sorted_people])

 

key 매개변수에 lambda 함수를 사용하여 각 요소를 어떻게 비교할지를 정의

 

- 실행결과

['Charlie', 'Alice', 'Bob']

728x90
반응형
LIST
728x90
반응형
SMALL

map 함수는 리스트의 각 요소에 특정 함수를 적용할 때 사용함

 

사용예제

(1) 실수 -> 정수 변환

a = [1.1, 2.2, 3.3 ,4.4]

b = list(map(int, a))

print(b)

 - 실행결과

[1, 2, 3, 4]

 

(2)  정수 문자 변환

a = [1, 2, 3 ,4]

b = list(map(str, a))

print(b)

 - 실행결과

['1', '2', '3', '4']

 

(3)  lambda 적용하기 

a = [1, 2, 3 ,4]

b = list(map(lambda x: x+1, a))

print(b)

 - 실행결과

[2, 3, 4, 5]

728x90
반응형
LIST
728x90
반응형
SMALL

enumerate

 - 순회 가능한(iterable) 객체(예: 리스트, 튜플, 문자열)를 입력으로 받아 인덱스와 해당 요소를 순회할 수 있는 이터레이터(iterator)를 반환

 - 반복문에서 현재 요소의 인덱스를 함께 사용하고자 할 때 유용함

 

enumerate 예제

 

animals = ['cat', 'dog', 'rabbit']

for index, animal in enumerate(animals):
    print("Index:", index, "Animal:", animal)

 

출력 결과

 

Index: 0, Animal: cat
Index: 1, Animal: dog
Index: 2, Animal: rabbit

 

위의 예제에서 enumerate() 함수는 리스트 animals의 각 요소와 해당 인덱스를 함께 반환합니다.

728x90
반응형
LIST

+ Recent posts