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

프로세스 (Process)

  • 프로세스는 독립적으로 실행되는 프로그램의 인스턴스입니다. 각 프로세스는 별도의 메모리 공간과 리소스를 가진다.
  • 장점:
    • GIL의 영향을 받지 않아, 진정한 병렬 처리가 가능합니다.( GIL은 Global Interpreter Lock의 약어로, 여러 개의 스레드가 파이썬 바이트코드를 한번에 하나만 사용할 수 있게 락을 거는 것을 의미한다, 바이트 코드(Byte code)는 고급 언어로 작성된 소스 코드를 가상머신 이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.)
    • 프로세스 간의 격리로 인해 하나의 프로세스에서 발생한 오류가 다른 프로세스에 영향을 주지 않습니다.(상호독립적으로 구성)
  • 단점:
    • 프로세스 간 통신(IPC, Inter-Process Communication)이 상대적으로 복잡하고 느립니다.
    • 메모리 사용량이 더 많습니다.

스레드 (Thread)

  • 정의: 스레드는 동일한 프로세스 내에서 실행되는 가벼운 단위입니다. 스레드들은 같은 메모리 공간을 공유합니다.
  • 장점:
    • 메모리 공유로 인한 효율적인 자원 사용.
    • 스레드 간 통신이 빠르고 간단합니다.
  • 단점:
    • GIL(Global Interpreter Lock)로 인해, 진정한 병렬 처리가 어렵습니다. (특히 CPU 바운드 작업에서)
    • 하나의 스레드에서 발생한 오류가 전체 프로세스에 영향을 줄 수 있습니다.

 

멀티스레딩 예지

import threading
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

print("All threads are done!")

 

멀티프로세싱 예제

import multiprocessing
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

process1 = multiprocessing.Process(target=print_numbers)
process2 = multiprocessing.Process(target=print_letters)

process1.start()
process2.start()

process1.join()
process2.join()

print("All processes are done!")

주요 차이점 요약

  • 메모리 공유: 스레드는 같은 메모리를 공유하지만, 프로세스는 별도의 메모리를 사용합니다.
  • GIL의 영향: 스레드는 GIL의 영향을 받으며, CPU 바운드 작업에서 성능이 제한될 수 있습니다. 반면, 프로세스는 GIL의 영향을 받지 않습니다.
  • 안정성: 프로세스는 서로 격리되어 있어 하나의 프로세스 오류가 다른 프로세스에 영향을 주지 않습니다.
  • 통신 방법: 스레드는 간단하고 빠른 통신이 가능하지만, 프로세스는 복잡하고 느린 통신을 사용합니다.

적절한 방법을 선택하는 것은 작업의 특성에 따라 다르며, I/O 바운드 작업에는 스레드를, CPU 바운드 작업에는 프로세스를 사용하는 것이 일반적입니다.

 

I/O 바운드: 입출력 작업이 많은 프로세스

CPU 바운드: 입출력 작업보다 연산작업이 많은 프로세스

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

파이썬에서 스레드를 사용하는 방법은 주로 `threading` 모듈을 통해 이루어집니다. 

이 모듈은 병렬 처리를 통해 여러 작업을 동시에 수행할 수 있도록 도와줍니다. 

 

스레드 예제

import threading
import time

# 스레드에서 실행할 함수 정의
def print_numbers():
    for i in range(1, 6):
        print(f"Number: {i}")
        time.sleep(1)

def print_letters():
    for letter in ['A', 'B', 'C', 'D', 'E']:
        print(f"Letter: {letter}")
        time.sleep(1.5)

# 스레드 생성
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

# 스레드 시작
thread1.start()
thread2.start()

# 메인 스레드가 thread1, thread2가 종료될 때까지 대기
thread1.join()
thread2.join()

print("All threads are done!")



### 코드 설명
1. `print_numbers`와 `print_letters`라는 두 개의 함수를 정의합니다. 각 함수는 숫자와 문자를 순차적으로 출력하며, 각 출력 사이에 `time.sleep`을 통해 지연 시간을 둡니다.
2. `threading.Thread` 클래스를 사용하여 두 개의 스레드를 생성합니다. 각각의 스레드는 실행할 함수를 `target` 인자로 받습니다.
3. `start()` 메서드를 호출하여 스레드를 시작합니다. 이 메서드를 호출하면 스레드가 백그라운드에서 실행되기 시작합니다.
4. `join()` 메서드를 사용하여 메인 스레드가 각 스레드의 실행이 완료될 때까지 기다리도록 합니다. 이 메서드를 호출하지 않으면 메인 스레드는 스레드의 실행이 완료되기 전에 종료될 수 있습니다.
5. 모든 스레드가 완료되면 "All threads are done!"이라는 메시지를 출력합니다.

이 예제는 두 개의 스레드를 생성하고 실행하며, 각각의 스레드가 독립적으로 동작하면서 동시에 숫자와 문자를 출력합니다. `join()` 메서드를 통해 메인 스레드가 두 스레드의 종료를 기다리므로, 모든 작업이 완료된 후에 "All threads are done!" 메시지가 출력됩니다.

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

문제 풀이 코드 설명

- data에서 원하는 위치를 쉽게 접근하기 위해 딕셔너리를 이용하여 index 적용

- data중에서 조건에 맞는 데이터 들만 선별함

- sorted key 를 이용하여 해당하는 키를 기준으로 정렬함

def solution(data, ext, val_ext, sort_by):
    answer = []
    
    key = {"code":0, "date":1, "maximum":2, "remain":3}
    
    # data중에서 조건에 맞는 데이터 들만 선별함
    for d in data:
        if d[key[ext]] < val_ext:
            answer.append(d)
            
    answer = sorted(answer,key=lambda x:x[key[sort_by]])
    
    return answer

 

 

===================================================================================

문제 설명

 

AI 엔지니어인 현식이는 데이터를 분석하는 작업을 진행하고 있습니다. 데이터는 ["코드 번호(code)", "제조일(date)", "최대 수량(maximum)", "현재 수량(remain)"]으로 구성되어 있으며 현식이는 이 데이터들 중 조건을 만족하는 데이터만 뽑아서 정렬하려 합니다.

예를 들어 다음과 같이 데이터가 주어진다면

data = [[1, 20300104, 100, 80], [2, 20300804, 847, 37], [3, 20300401, 10, 8]]

 

이 데이터는 다음 표처럼 나타낼 수 있습니다.

code date maximum remain
1 20300104 100 80
2 20300804 847 37
3 20300401 10 8

주어진 데이터 중 "제조일이 20300501 이전인 물건들을 현재 수량이 적은 순서"로 정렬해야 한다면 조건에 맞게 가공된 데이터는 다음과 같습니다.

data = [[3,20300401,10,8],[1,20300104,100,80]]

 

정렬한 데이터들이 담긴 이차원 정수 리스트data와 어떤 정보를 기준으로 데이터를 뽑아낼지를 의미하는 문자열ext, 뽑아낼 정보의 기준값을 나타내는 정수val_ext, 정보를 정렬할 기준이 되는 문자열sort_by가 주어집니다.

data에서ext값이val_ext보다 작은 데이터만 뽑은 후,sort_by에 해당하는 값을 기준으로 오름차순으로 정렬하여 return 하도록 solution 함수를 완성해 주세요. , 조건을 만족하는 데이터는 항상 한 개 이상 존재합니다.

 

 

제한사항

1 data의 길이 500

data[i]의 원소는 [코드 번호(code), 제조일(date), 최대 수량(maximum), 현재 수량(remain)] 형태입니다.

1 코드 번호100,000

20000101 제조일29991231

data[i][1]yyyymmdd 형태의 값을 가지며, 올바른 날짜만 주어집니다. (yyyy : 연도, mm : , dd : )

1 최대 수량10,000

1 현재 수량최대 수량

extsort_by의 값은 다음 중 한 가지를 가집니다.

"code", "date", "maximum", "remain"

순서대로 코드 번호, 제조일, 최대 수량, 현재 수량을 의미합니다.

val_extext에 따라 올바른 범위의 숫자로 주어집니다.

정렬 기준에 해당하는 값이 서로 같은 경우는 없습니다.

 

 

입출력 예

data ext val_ext sort_by result
[[1, 20300104, 100, 80],
[2, 20300804, 847, 37],
[3, 20300401, 10, 8]]
"date" 20300501 "remain" [[3,20300401,10,8],
[1,20300104,100,80]]

 

입출력 예 설명

입출력 예 #1

본문의 내용과 동일합니다.

 

 

cpp를 응시하는 경우 리스트는 배열과 동일한 의미이니 풀이에 참고해주세요.

ex) 번호가 담긴 정수리스트numbers가 주어집니다. => 번호가 담긴 정수배열numbers가 주어집니다.

java를 응시하는 경우 리스트는 배열, 함수는 메소드와 동일한 의미이니 풀이에 참고해주세요.

ex) solution함수가 올바르게 작동하도록 한 줄을 수정해 주세요. => solution메소드가 올바르게 작동하도록 한 줄을 수정해 주세요.

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

문제 해답 코드 풀이
- 성격유형의 점수를 저장하기 위한 공간으로 딕셔너리를 이용함(성격 유형 알파벳으로 바로 접근을 위해)
질문에 따라 점수(score)와 성경유형의 위치(pos)를 판단하고 점수를 증가시킴
- 지표에 따라 성격유형 알파벳을 만든다.

def solution(survey, choices):
    answer = ''
    
    h = {'R':0,'T':0,'C':0,'F':0,'J':0,'M':0,'A':0,'N':0}    
    
    for i, c in enumerate(survey):
        score = abs(4-choices[i])
        pos = 0 if choices[i]<4 else 1        
        h[c[pos]] += score        
    
    answer = 'R' if h['R'] >= h['T'] else 'T'
    answer += 'C' if h['C'] >= h['F'] else 'F'
    answer += 'J' if h['J'] >= h['M'] else 'M'
    answer += 'A' if h['A'] >= h['N'] else 'N'        
    
    return answer

 
 
 
===========================================================================================
 
 
문제 설명
 
나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.

지표 번호성격 유형
1번 지표라이언형(R), 튜브형(T)
2번 지표콘형(C), 프로도형(F)
3번 지표제이지형(J), 무지형(M)
4번 지표어피치형(A), 네오형(N)

4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.
검사지에는 총n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.
매우 비동의
비동의
약간 비동의
모르겠음
약간 동의
동의
매우 동의
각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.
예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

선택지성격 유형 점수
매우 비동의네오형 3점
비동의네오형 2점
약간 비동의네오형 1점
모르겠음어떤 성격 유형도 점수를 얻지 않습니다
약간 동의어피치형 1점
동의어피치형 2점
매우 동의어피치형 3점

이때 검사자가 질문에서약간 동의선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가매우 비동의선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.
위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.
하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.
매우 동의나매우 비동의선택지를 선택하면 3점을 얻습니다.
동의나비동의선택지를 선택하면 2점을 얻습니다.
약간 동의나약간 비동의선택지를 선택하면 1점을 얻습니다.
모르겠음선택지를 선택하면 점수를 얻지 않습니다.
검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
질문마다 판단하는 지표를 담은 1차원 문자열 배열survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.

 
 
제한사항
1 ≤survey의 길이 ( =n) ≤ 1,000
survey의 원소는"RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA"중 하나입니다.
survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.

choices의 길이 =survey의 길이
choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
1 ≤choices의 원소 ≤ 7

choices
1매우 비동의
2비동의
3약간 비동의
4모르겠음
5약간 동의
6동의
7매우 동의

 

 
입출력 예

surveychoicesresult
["AN", "CF", "MJ", "RT", "NA"][5, 3, 2, 7, 5]"TCMA"
["TR", "RT", "TR"][7, 1, 3]"RCJA"

 
 
입출력 예 설명

입출력 예 #1
1번 질문의 점수 배치는 아래 표와 같습니다.

선택지성격 유형 점수
매우 비동의어피치형 3점
비동의어피치형 2점
약간 비동의어피치형 1점
모르겠음어떤 성격 유형도 점수를 얻지 않습니다
약간 동의네오형 1점
동의네오형 2점
매우 동의네오형 3점

1번 질문에서는 지문의 예시와 다르게 비동의 관련 선택지를 선택하면 어피치형(A) 성격 유형의 점수를 얻고, 동의 관련 선택지를 선택하면 네오형(N) 성격 유형의 점수를 얻습니다.
1번 질문에서 검사자는약간 동의선택지를 선택했으므로 네오형(N) 성격 유형 점수 1점을 얻게 됩니다.
2번 질문의 점수 배치는 아래 표와 같습니다.

선택지성격 유형 점수
매우 비동의콘형 3점
비동의콘형 2점
약간 비동의콘형 1점
모르겠음어떤 성격 유형도 점수를 얻지 않습니다
약간 동의프로도형 1점
동의프로도형 2점
매우 동의프로도형 3점

2번 질문에서 검사자는약간 비동의선택지를 선택했으므로 콘형(C) 성격 유형 점수 1점을 얻게 됩니다.
3번 질문의 점수 배치는 아래 표와 같습니다.

선택지성격 유형 점수
매우 비동의무지형 3점
비동의무지형 2점
약간 비동의무지형 1점
모르겠음어떤 성격 유형도 점수를 얻지 않습니다
약간 동의제이지형 1점
동의제이지형 2점
매우 동의제이지형 3점

3번 질문에서 검사자는비동의선택지를 선택했으므로 무지형(M) 성격 유형 점수 2점을 얻게 됩니다.
4번 질문의 점수 배치는 아래 표와 같습니다.

선택지성격 유형 점수
매우 비동의라이언형 3점
비동의라이언형 2점
약간 비동의라이언형 1점
모르겠음어떤 성격 유형도 점수를 얻지 않습니다
약간 동의튜브형 1점
동의튜브형 2점
매우 동의튜브형 3점

4번 질문에서 검사자는매우 동의선택지를 선택했으므로 튜브형(T) 성격 유형 점수 3점을 얻게 됩니다.
5번 질문의 점수 배치는 아래 표와 같습니다.

선택지성격 유형 점수
매우 비동의네오형 3점
비동의네오형 2점
약간 비동의네오형 1점
모르겠음어떤 성격 유형도 점수를 얻지 않습니다
약간 동의어피치형 1점
동의어피치형 2점
매우 동의어피치형 3점

5번 질문에서 검사자는약간 동의선택지를 선택했으므로 어피치형(A) 성격 유형 점수 1점을 얻게 됩니다.
1번부터 5번까지 질문의 성격 유형 점수를 합치면 아래 표와 같습니다.

지표 번호성격 유형점수성격 유형점수
1번 지표라이언형(R)0튜브형(T)3
2번 지표콘형(C)1프로도형(F)0
3번 지표제이지형(J)0무지형(M)2
4번 지표어피치형(A)1네오형(N)1

각 지표에서 더 점수가 높은T,C,M이 성격 유형입니다.
하지만, 4번 지표는 1점으로 동일한 점수입니다. 따라서, 4번 지표의 성격 유형은 사전순으로 빠른A입니다.
따라서"TCMA"를 return 해야 합니다.
입출력 예 #2
1번부터 3번까지 질문의 성격 유형 점수를 합치면 아래 표와 같습니다.

지표 번호성격 유형점수성격 유형점수
1번 지표라이언형(R)6튜브형(T)1
2번 지표콘형(C)0프로도형(F)0
3번 지표제이지형(J)0무지형(M)0
4번 지표어피치형(A)0네오형(N)0

1번 지표는 튜브형(T)보다 라이언형(R)의 점수가 더 높습니다. 따라서 첫 번째 지표의 성격 유형은R입니다.
하지만, 2, 3, 4번 지표는 모두 0점으로 동일한 점수입니다. 따라서 2, 3, 4번 지표의 성격 유형은 사전순으로 빠른C,J,A입니다.
따라서"RCJA"를 return 해야 합니다.
 
 

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

 

문제 설명

 

게임개발자인 "죠르디"는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
"죠르디"는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.

 

게임 화면은"1 x 1"크기의 칸들로 이루어진"N x N"크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 "5 x 5" 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1, 5, 3] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.

 

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형두 개가 없어집니다.

 

크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면표시 제약으로 5칸만으로 표현하였음)

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

[제한사항]

board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.

board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.

0은 빈 칸을 나타냅니다.

1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.

moves 배열의 크기는 1 이상 1,000 이하입니다.

moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

입출력 예

board moves result
[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

입출력 예에 대한 설명

입출력 예 #1

인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.

 

================================================================================

문제풀이

- 먼저 인형을 담을 공간 리스트 변수(temp로 선언)를 선언하고 moves 변수의 값을 이용하여 board 로 부터 인형을 하나씩 옮겨 담는다. 이때 인덱스 를 1씩 증가 시키면서 0이 아닌 수를 찾는다. 만약 찾으면 그 칸은 0 으로 저장하고 찾은 수(인형)은 temp에 append 시킨다.

- moves 에 저장된 값들이 실행이 되고 temp 리스트 끝에서 처음으로 이동하면서 2개씩 연속된 숫자들이 있는지 찾는다. 이때 있으면 제거하고 다시 temp의 끝에서 처음으로 이동한다. 이동 index 가 0보다 클때까지 반복한다.

def solution(board, moves):
    
    answer = 0
    temp = []
    
    # 옮기는 코드
    for i in moves:
        for j in range(len(board)):
            if board[j][i-1]!=0:
                temp.append(board[j][i-1])    
                board[j][i-1] = 0
                break
    
    #연속된 인형(수) 있는지 찾는 코드
    i = len(temp)-1
    while i>0:
        if (temp[i] == temp[i-1]):
            del temp[i-1:i+1]
            i = len(temp)-1
            answer += 2
            
        else:
            i -= 1
            
    return answer

 

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

tkinter 를 이용한 마우스 이벤트는

window에 bind 함수를 이용하여 마우스 이벤트를 각각 연결시킨다.

 

이때 bind() 함수는 다음과 같이 두 개의 이자를 가져야 한다.

 - bind("이벤트명",연결함수) #이벤트 연결을 위한 가장 중요한 함수!!!!!

 

이벤트 종류는 다음과 같다.

<Button-1> : 마우스 왼쪽 버튼 클릭
<Button-2> : 마우스 중간 버튼 클릭
<Button-3> : 마우스 오른쪽 버튼 클릭
<Button-4> : 마우스 휠을 스크롤바에서 위로 올릴 때(scroll up event)
<Button-5> : 마우스 휠을 스크롤바에서 아래로 내릴 때(scroll down event)
<ButtonPress> : 아무 마우스 버튼이라도 눌리면 호출 된다. 휠까지도
<Double-Button-1> : 마우스 왼쪽 버튼 더블 클릭
<Double-Button-2> : 마우스 중간 버튼 더블 클릭
<Double-Button-3> : 마우스 오른쪽 버튼 더블 클릭
<Return> : 엔터가 눌러짐
<Key> : 키가 눌러짐
<Enter> : 마우스 포인터가 위젯에 들어올 때
<Leave> : 마우스 포인터가 위젯을 떠날때
<Configure> : 위젯 사이즈에 변화가 있을때

 

이중에서 마우스와 관련 된 이벤트를 적용한 코드 예제는 아래와 같다.

from tkinter import *

class MouseEvent:
    def __init__(self):
        window = Tk()
        window.title("마우스 이벤트")
        window.geometry("640x480")
        
        self.canvas=Canvas(window, bg ="white")
        self.canvas.pack(expand=True, fill=BOTH)
        window.bind("<Button-1>",self.MouseClickEvent)
        window.bind('<Double-1>', self.MouseDoubleClickEvent)
        window.bind('<B1-Motion>', self.MouseMotionEvent) 

        self.mousestr = "Mouse: "
        self.mouse_id = self.canvas.create_text(320,240,font="Times 15 italic bold",text=self.mousestr)    
        self.canvas.create_text(320,360,font="Times 15 italic bold",text="Mouse Event Example")
        
        while True:
            #
            self.canvas.itemconfigure(self.mouse_id, text=self.mousestr)
            #
            window.after(33)
            window.update()

    def MouseClickEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 클릭 이벤트 발생"
        

    def MouseDoubleClickEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 더블 클릭 이벤트 발생"

    def MouseMotionEvent(self, event):
        self.mousestr = "Mouse: " + str(event.x) + ", " + str(event.y) + "에서 마우스 모션 이벤트 발생"


MouseEvent()
728x90
반응형
LIST
728x90
반응형
SMALL

문제 설명
두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항
3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
X, Y는 0으로 시작하지 않습니다.
X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

 

입출력 예

X Y result
"100" "2345" "-1"
"100" "203045" "0"
"100" "123450" "10"
"12321" "42531" "321"
"5525" "1255" "552"

-------------------------------------------------------------------------------------------

문제 풀이

 

(다양한 방법의 풀이가 있으나) 여기서는 dictionary 타입으로 각 문자의수를 저장하고, 유일한 키값 해시를 이용하여 문자의 수를 하나씩 차감함으로써 문제를 해결한다.

각 테스트 데이터에 대한 H 는 다음과 같다.

 

- 테스트 데이터 1: H = {'2': 1, '3': 1, '4': 1, '5': 1}

-  테스트 데이터 2: H = {'2': 1, '0': 2, '3': 1, '4': 1, '5': 1}

-  테스트 데이터 3: H = {'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '0': 1}

-  테스트 데이터 4: H = {'4': 1, '2': 1, '5': 1, '3': 1, '1': 1}

-  테스트 데이터 5: H = {'1': 1, '2': 1, '5': 2}

 

def solution(X, Y):
    answer = ''
    H = {}
    
    for i in Y:
        if i not in H:
            H[i] = Y.count(i)
    
    for i in X:
        if i in H and H[i] > 0:
            answer += i
            H[i] -= 1
            
    answer = "".join(sorted(list(answer),reverse=True))
    
    if len(answer)==0: return "-1"
    elif len(answer)==answer.count("0"): return "0"
    
    return answer

 

 

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

1. 문제 설명

 

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.

nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

 

2. 입출력 예

nums result
[1,2,3,4] 1
[1,2,7,6,4] 4

입출력 예 설명

입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.

 

3. 문제 풀이

서로 다른 3개를 골라야 되기 때문에 3중 for 문을 쓰던 combinations를 import 시켜서 조합을 만들어내야된다.

작성된 코드 설명은 다음과 같다

(1) 코드는 단순하게 3중 for 문을 써서 조합을 만들다.

(2) 조합중 2,3 으로 나누어 떨어지는 수들을 먼저 제외시킨다.

(3) 나머지 수들 중 1을 제외한 홀수로 나누어 떨어짐을 검사해서 소수를 찾음

def solution(nums):
    
    answer = 0
    l = len(nums)
    
    for i in range(l-2):
        for j in range(i+1,l-1):
            for q in range(j+1,l):
                s = nums[i]+nums[j]+nums[q]
                if s%2==0 or s%3==0:
                    continue
                else:
                    prime = True
                    for r in range(3,int(s**0.5)+1,2):
                        if s%r==0:
                            prime = False
                            break
                    if prime:
                        answer += 1
    
    return answer
728x90
반응형
LIST

+ Recent posts