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

문제 설명
두 정수 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
728x90
반응형
SMALL

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

제한 조건

n2이상 1000000이하의 자연수입니다.

입출력 예

n result
10 4
5 3

입출력 예 설명

입출력 예 #1
1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환

입출력 예 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

 

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

문제 풀이

1) 소수 찾기 기본 코드

조건식을 이용하여 나누어 떨어짐을 확인한다. 검사 끝은 i 에 루트(i**0.5, )를 적용한 수 까지 찾는다.

def solution(n):
    answer = 0
    for i in range(2,n+1):
        prime = True
        for j in range(2,int(i**0.5)+1):
            if i%j==0:
                prime = False
                break

        if prime:
            answer += 1
        
    
    return answer

효율성 결과는?

2) 효율성 개선 코드

체크 해야될 수 중에서 짝수와 짝수 약수를 제거하여 아래와 같이 코드를 변경하였다.

def solution(n):
    answer = 1
    for i in range(3,n+1,2):        
        prime = True
        for j in range(3,int(i**0.5)+1,2):            
            if i%j==0:
                prime = False
                break
            
        if prime:
            answer += 1
        
    
    return answer

효율성 결과는? 약 2배정도 빠라짐을 확인할 수 있다.

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

문제 설명


과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.

한 상자에 사과를 m개씩 담아 포장합니다.
상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.
과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)

예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.

(최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8
사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.

 

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

문제 풀이

문제 설명에서 가장 낮은 점수의 사과를 기준으로 가격을 계산하기 때문에 낮은 점수의 사과들과 높은 점수의 사과들을 묶어야 함(이 문제의 가장 핵심)

1. 문제를 편하게 풀기 위해 먼저 정렬을 함

2. 최대 이익을 얻기 위해서는 필요한 사과 상자의 수가 제한적이므로 높은 점수의 사과 상자들을 먼저 가져가야함: 정렬시 reverse 설정함

3. 묶음 들 중에 가장 낮은 점수의 사과를 뽑아냄 (아래 코드에서 [m-1::m] 부분)

 

가격 계산 후 리턴함

def solution(k, m, score):
    
    temp = sorted(score,reverse=True)[m-1::m]# 설명 1,2
    
    answer = [p * m for p in temp]# 설명 3
    
    return sum(answer)

 

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

문제 설명


수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건
시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

 

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

문제 풀이

1,2,3번의 수포자의 답 순서들을 리스트에 저장하고 반복문안에서 문제의 해답들이 수포자가 찍은 답과 맞는 지 차례로 비교한다. 이때 index 는 나머지 연산자(%)를 이용하여 반복적으로 수포자 답을 접근한다.

 

def solution(answers):
    c = [0,0,0]
    
    a0 = [1,2,3,4,5]
    a1 = [2,1,2,3,2,4,2,5]
    a2 = [3,3,1,1,2,2,4,4,5,5]
    
    for i in range(len(answers)):
        if a0[i%len(a0)]==answers[i]:
            c[0] += 1
        if a1[i%len(a1)]==answers[i]:
            c[1] += 1
        if a2[i%len(a2)]==answers[i]:
            c[2] += 1
   
    m = max(c)
    answer = []
    for i in range(3):
        if c[i] ==m:
            answer.append(i+1)
    
    
    return answer
728x90
반응형
LIST
728x90
반응형
SMALL

문제 설명


당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
두 번째(1번), 세 번째(2번) 폰켓몬을 선택
두 번째(1번), 네 번째(3번) 폰켓몬을 선택
세 번째(2번), 네 번째(3번) 폰켓몬을 선택
이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

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

문제 풀이

폰켓몬의 수 N 중에서 최대 N/2 개의 폰켓몬을 가질 수 있으며, 동일한 종류가 있을 경우, 수가 작아진다.

 

문제예를 이용한 풀이

[3번, 2번, 2번, 3번, 3번, 2번]

위와 같이 주어진다면 최대 3개를 가질 수 있으니 3번이 3개, 2번이 3개로 2번, 3번 이렇게 2종류 밖에 없기 때문에 2개만 가지게 된다.

 

결국 최대 가질 수 있는 수와 중복되지 않는 종류의 수 중에서 작은 값을 리턴하면 된다.

정답 코드

def solution(nums):
    m = len(nums)//2
    n = len(list(set(nums)))
    
    return min(m,n)

 

 

 

728x90
반응형
LIST

'IT > 코딩테스트' 카테고리의 다른 글

프로그래머스 과일 장수 설명, 코딩, 답  (0) 2024.05.14
프로그래머스 모의고사 문제 답 코딩  (1) 2024.05.14
특이한정렬  (0) 2024.05.08
소인수분해  (0) 2024.05.07
안전지대  (0) 2024.05.04

+ Recent posts