문제 설명

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

입출력 예

numbers return
17 3
011 2

 


내 문제풀이

1. permutations()를 사용해서 numbers에서 나올 수 있는 모든 조합의 수를 계산 후 리스트에 추가하고 set()으로 중복을 제거한다.
2. 생성한 리스트를 반복문을 돌며 소수인지 판별한다. 소수이면 answer값을 +1 해준다.

itertools.permutations

permutations(값, 만들 조합의 자릿수) 를 하면 tuple 형태로 쪼개어 수 조합을 만들어준다.

예를 들어 permutations('123', 2)인 경우 [('1', '2'), ('1', '3'), ('2', '3')]가 반환된다.

내 코드 - 파이썬

from itertools import permutations

def solution(numbers):
    answer = 0
    num_list = []
    for i in range(1, len(numbers)+1):
        per_list = list(permutations(numbers, i))
        for j in per_list:
            num_list.append(''.join(j))
    num_list = set([int(x) for x in num_list])
    
    for num in num_list:
        is_prime = 1
        if num<2:
            continue
        for i in range(2, num):
            if(num%i==0):
                is_prime = 0
                break
        if(is_prime): answer+=1
        
    return answer

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown yellow return
10 2 [4, 3]
8 1 [3, 3]
24 24 [8, 6]

 


내 문제풀이

1. 갈색의 세로 (짧은 쪽) 최소 길이는 3이다. 따라서 테두리 세로 길이를 3부터 1씩 증가시키며 반복문을 수행한다.
2. 노란색(가운데)의 격자 수(넓이)는 (갈색 가로 길이-2)*(갈색 세로 길이-2)이다. 이 때 갈색 가로 길이는 (총 갈색 격자 수//2 - 갈색 세로 길이 + 2)이다. +2가 필요한 이유는 양 끝의 세로 격자 1개씩 추가해야 하기 때문이다. 
3. 반복문을 수행하다가 (갈색 가로 길이-2)*(갈색 세로 길이-2) == 노란색의 넓이(격자 수) 인 경우 갈색의 가로 길이, 갈색의 세로 길이 배열을 반환한다.

내 코드 - 파이썬

def solution(brown, yellow):
    answer = []
    
    for col in range(3, brown//2):
        if (col-2)*(brown//2-col) == yellow:
            return [brown//2-col+2, col]
    

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

입출력 예

answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 


내 문제풀이

1. 1번, 2번, 3번 수포자의 문제 푸는 방식을 반복 없이 list에 저장한다.
2. answers 길이 만큼 반복문을 돌며 1번, 2번, 3번 수포자의 찍은 번호와 정답 번호를 비교한다. 이 때 같으면(정답) grade 리스트에 +1을 한다. grade 리스트의 index(n-1)는 n번 수포자를 의미한다.
3. grade의 가장 큰 값을 구한 후 해당 정답 갯수와 일치하는 수포자를 answer 리스트에 추가하여 반환한다.

내 코드 - 파이썬

def solution(answers):
    answer = []
    grade = [0]*3
    first = [1,2,3,4,5]
    second = [2, 1, 2, 3, 2, 4, 2, 5]
    third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    for idx in range(0, len(answers)):
        if answers[idx] == first[idx%5]:
            grade[0] += 1
        if answers[idx] == second[idx%8]:
            grade[1] += 1
        if answers[idx] == third[idx%10]:
            grade[2] += 1
    
    max_grade = max(grade)
    for idx in range(0, 3):
        if grade[idx] == max_grade:
            answer.append(idx+1)  
    
    return answer

문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

입출력 예

citations return
[3, 0, 6, 1, 5] 3

 


내 문제풀이

1. citations를 오름차순 정렬한다.
2. citiations의 값들을 현재 값 뒤에 있는 원소 갯수(현재 값보다 크거나 같은 수의 갯수)와 비교한다. 현재 값이 뒤에 있는 원소 갯수보다 큰 경우 "h번 이상 인용된 논문이 h편 이상" 조건이 만족한다.
3. 이 때 h 값인 뒤에 있는 원소 갯수를 반환한다.
4. 반복문이 끝났을 때도 반환이 되지 않으면 0을 반환한다. 이 때는 모든 input이 0인 경우이다.(나도 구글링을 통해서 해당 테스트케이스를 참고해서 코드를 추가했다.)

내 코드 - 파이썬

def solution(citations):
    citations.sort()
    for idx in range(len(citations)):
        if citations[idx] >= len(citations) - idx: 
            return (len(citations) - idx)
        
    # 모든 input이 0일 때    
    return 0

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

numbers return
[6, 10, 2] 6210
[3, 30, 34, 5, 9] 9534330

 


내 문제풀이

1. numbers가 모두 0인 경우 예외처리로 먼저 return '0'을 해준다.
2. numbers를 string 타입 원소를 가진 리스트로 변환한다.
3. numbers의 원소는 모두 1000 이하의 값이기 때문에 3자리 수를 맞춰 값들을 내림차순 정렬한다.
4. numbers 값들을 하나의 string 값으로 합친다.

내 코드 - 파이썬

def solution(numbers):
    answer = ''
    
    if sum(numbers)==0:
        return '0'
    numbers = list(map(str, numbers))
    numbers.sort(key=lambda x: x*3, reverse=True)
    
    return ''.join(numbers)

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
3. 2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

array commands return
[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

 


내 문제풀이

1. commands를 하나 씩 반복문을 수행한다.
2. 한 commands의 첫 번째, 두 번째 원소로 slicing하여 만든 select_list를 생성한다.
3. select_list를 정렬하고 한 commands의 세 번째 원소로 값을 추출하여 answer에 삽입한다.

내 코드 - 파이썬

def solution(array, commands):
    answer = []
    
    for cmd in commands:
        select_list = (array[cmd[0]-1:cmd[1]])
        select_list.sort()
        answer.append(select_list[cmd[2]-1])
    
    return answer

문제 설명

이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.

명령어 수신 탑(높이)
I 숫자 큐에 주어진 숫자를 삽입합니다.
D 1 큐에서 최댓값을 삭제합니다.
D -1 큐에서 최솟값을 삭제합니다.

이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.

제한사항

  • operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.
  • operations의 원소는 큐가 수행할 연산을 나타냅니다.
    - 원소는 “명령어 데이터” 형식으로 주어집니다.
    - 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
  • 빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.

입출력 예

operations return
[I 16,D 1] [0,0]
[I 7,I 5,I -5,D -1] [7,5]

 


내 문제풀이

1. 리스트에서 최대, 최소값을 명령어에 따라 계속 찾아 제거해야 하므로, heapq를 사용한다.
2. operations를 반복문을 돌며 하나씩 빼서 확인한다.
3. 명령어의 앞 문자가 I인 경우, heapq(answer)에 값을 추가한다.
4. 이 외 명령어(제거)에 answer이 비어있다면 해당 명령어를 무시한다. 또한 비어있지 않으면 명령어의 뒷 값을 1과 -1로 구분하여 1이면 최대값을 제거, -1이면 최소값을 제거한다.
5. 반복문이 끝난 후 answer에 아직 값이 남아있다면 최대값, 최소값 배열을 반환한다. 
6. answer아 비어있다면 [0,0]을 반환한다.

내 코드 - 파이썬

import heapq
    
def solution(operations):
    answer = []
    
    for op in operations:
        if op.split(" ")[0] == 'I':
            heapq.heappush(answer, int(op.split(" ")[1]))
    
        else:
            if not answer:
                continue
                
            if op.split(" ")[1] == '1':
                answer.pop(-1)
            else:
                answer.pop(0)        
    
    if answer:
        return [max(answer), min(answer)]
    else:
        return [0,0]
       

문제 설명

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.
예를들어
- 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청
와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다.

한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.

- A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms) - B: 1ms부터 대기하다가, 3ms 시점에 작업을 시작해서 12ms 시점에 작업 완료(요청에서 종료까지 : 11ms) - C: 2ms부터 대기하다가, 12ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 16ms)
이 때 각 작업의 요청부터 종료까지 걸린 시간의 평균은 10ms(= (3 + 11 + 16) / 3)가 됩니다.
하지만 A → C → B 순서대로 처리하면

- A: 3ms 시점에 작업 완료(요청에서 종료까지 : 3ms) - C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms 시점에 작업 완료(요청에서 종료까지 : 7ms) - B: 1ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)
이렇게 A → C → B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(= (3 + 7 + 17) / 3)가 됩니다.
각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)

제한 사항

  • jobs의 길이는 1 이상 500 이하입니다.
  • jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.
  • 각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.
  • 각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.
  • 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.

입출력 예

jobs return
[[0, 3], [1, 9], [2, 6]] 9

 


내 문제풀이

1. jobs를 두번째 인자를 기준으로 오름차순 정렬한다.
2. jobs의 작업들이 남아 있는 동안 반복문을 수행한다.
3. 가장 마지막 작업이 끝난 시간을 final에 저장하며 정렬한 jobs 중 첫번째 인자가 final 보다 작거나 같은지 비교한다.
4. jobs 중 첫번째 인자가 final 보다 작거나 같다면 final과 총 소요 시간을 갱신하고 jobs에서 해당 작업을 삭제한다.
5. 만약 모든 jobs의 첫번째 인자가 final보다 크다면 final을 +1 하고 반복문을 수행한다.
6. 마지막으로 평균 소요시간을 구해야하므로 총 소요시간을 작업 갯수들로 나누고 나머지는 버리기 때문에 int()를  씌워준다.

내 코드 - 파이썬

def solution(jobs):
    answer = 0
    jobs.sort(key=lambda x : x[1])
    final = 0
    job_len = len(jobs)
    
    while(jobs):
        for idx in range (0, len(jobs)):
            if jobs[idx][0] <= final:
                final += jobs[idx][1]
                answer += final-jobs[idx][0]
                jobs.pop(idx)
                break
            
            if idx == len(jobs)-1:
                final+=1
    
    return int(answer//job_len)

+ Recent posts