• Counter로 입력받은 원소가 몇 번 등장하는지 세어준다.
  • count.items() 즉, key값을 기준으로 내림차순 정렬한다. (리스트 안 튜플 형태로 저장됨)
  • 가장 큰 수가 두 개 이상 존재한다면 '큰 수 * M(총 수)'가 답이 된다. (서로 다른 인덱스에 같은 수가 저장되면 값이 같아도 서로 다른 것으로 간주하기 때문 -> 이 부분은 책의 풀이에서 놓치고 있다)
  • 가장 큰 수가 한 번 등장하면 큰 수와 다음으로 큰 수가 번갈아가며 더해져야 한다.
    • 두 번째 큰 수의 등장 순서는 n%(K+1)로 구한다.

 

from collections import Counter

N, M, K = map(int, input().split())
A = list(map(int, input().split()))
count = Counter(A)
count = sorted(count.items(), reverse=True)

answer = 0

if(count[0][1] > 1):
    answer += count[0][0] * M
else:
    n = 1
    while(n <= M):
        if (n%(K+1) != 0):
            answer += count[0][0]
        else:
            answer += count[1][0]
        n += 1

print(answer)

 

 

 

  • 내장 함수 : import 명령어 없이 바로 사용할 수 있는 함수
  • input(), print() 등
  • sum() : 리스트와 같은 iterable 객체가 입력으로 주어졌을 때, 모든 원소의 합 반환
result = sum([1,2,3,4,5])
print(result)	#15

 

  • min() : 파라미터가 2개 이상 들어왔을 때 가장 작은 값 반환
  • max()
  • eval() : 수학 수식이 문자열 형식으로 들어오면 해당 수식 계산한 결과 반환
result = eval("(3 + 5) * 7")
print(result)	#56

 

  • sorted()
    • iterable 객체가 들어왔을 때 정렬된 결과 반환
    • key 속성으로 정렬 기준을 명시할 수 있음
    • reverse 속성으로 정렬된 결과를 뒤집을지의 여부를 설정할 수 있음
    • 리스트와 같은 iterable 객체는 sort() 함수 사용하면 됨
result = sorted([9,1,8,5,4])	#오름차순
print(result)	#[1,4,5,8,9]

result = sorted([9,1,8,5,4], reverse=True)	#내림차순
print(result)	#[9,8,5,4,2]

# 원소를 튜플의 두 번째 원소(나이)를 기준으로 내림차순 정렬
result = sorted([('홍길동',35),('이순신',75),('아무개',50)], key = lambda x : x[1], reverse=True)
print(result)	#[('이순신',75),('아무개',50),('홍길동',35)]

 

 

  • global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고 함수 바깥에 선언된 변수를 바로 참조
a = 0

def func():
    global a
    a += 1
    
for i in range(10):
    func()
    
print(a)

 

 

 

1. range()의 값으로 하나의 값만 넣으면 자동으로 시작 값은 0이 된다. 주로 리스트나 튜플의 모든 원소를 첫 인덱스부터 방문해야 할 때 이 방법 사용.

scores = [90,85,77,65,97]

for i in range(5):
	if scores[i] >= 80:
    	print(i+1, "번 학생은 합격입니다.")

 

2. 반복문 안에서 continue를 만나면 프로그램의 흐름은 반복문 처음으로 돌아간다.

scores = [90,85,77,65,97]
cheating_set = {2,4}

for i in range(5):
    if i+1 in cheating_set:
        continue
    if scores[i] >= 80:
    	print(i+1, "번 학생은 합격입니다.")

 

 

1. 조건부 표현식(자바의 삼항 연산자)

score = 85
result = "success" if score >= 80 else "fail"

print(result)

 

2. 리스트에서 특정 원소 없애기

a = [1,2,3,4,5,5,5]
remove_set = {3,5}

result = [i for i in a if i not in remove_set]

print(result)

 

3. 파이썬 조건문 내 부등식 : 수학 부등식 그대로 사용 가능

"x > 0 and x < 20"과 "0 < x < 20"은 같은 결과 반환

 

 

  • string으로 주어진 시간을 int(시간*60+분)으로 변환하고 리스트에 (시작시간, 끝시간) 형태의 튜플로 다시 집어넣음
  • 튜플이 들어간 리스트를 시작 시간 기준으로 오름차순 sort
  • 예약된 방을 저장하기 위한 최소heap 생성
  • for문 돌리면서 
    • heap이 비어있으면 가장 첫번째 튜플의 끝시간 삽입, answer 1개 증가
    • 다음 순서부터 heap[0] (가장 빠른 end 시간)과 새로운 예약의 start 시간 비교
    • heap[0]보다 새로운 예약의 시작 시간이 뒷 시간이면 heap[0]을 pop : 새 방이 필요없으니까
    • 그렇지 않은 경우 answer 1 증가 : 새 방이 필요하니까
    • heap을 pop하든 answer를 1 증가하든 새 예약을 heap에 push한다.

 

import heapq

def solution(book_time):
    answer = 0
    
    booking = [(int(s[:2])*60+int(s[3:]),int(e[:2])*60+int(e[3:])+10) for s,e in book_time]
    booking.sort()  #시작시간으로 오름차순 정렬
    
    heap = [] 
    for s, e in booking:
        if not heap:
            heapq.heappush(heap, e)     
            answer += 1                 
            continue
            
        if(heap[0] <= s):               
            heapq.heappop(heap)         
        else:
            answer += 1                 
       
        heapq.heappush(heap, e)         
    
    return answer
  • 리스트 원소 각각의 등장 횟수를 세어 key, value 형태로 저장하는 counter 라이브러리 사용이 핵심!
  • weights 리스트를 counter로 변환해준 뒤 items()함수로 key, value 값을 각각 가지고 온다.
  • (1,1), (1,2)/(2,4), (2,3), (3,4) 이 비율에 해당하는 값이 counter에 있는지 세어보고 세어본 숫자를 answer에 합친다.
    • (1,1) : 예를 들어 100이라는 무게가 list에 10개가 있다면 순서에 관계없이 10개 중 2개를 뽑는 경우의 수를 구해야 한다. 즉, n 콤비네이션 2를 계산해야 한다.

 

from collections import Counter

def solution(weights):
    answer = 0
    
    counter = Counter(weights)
    for w, n in counter.items():    #key, value
        answer += n * (n-1) // 2     #(1,1)
        for dis1, dis2 in [(1,2),(2,3),(3,4)]:
            answer += counter[w * dis1 / dis2] * n
    
    return answer
n = int(input())

call = list(map(int, input().split()))
print(call)

call = map(int, input().split())	# map 객체 생성
print(call)	# map 안의 내용 볼 수 없음
print(list(call))	# list로 출력해야 함

input으로 정수 여러 개 받아올 때 map으로 입력값을 int로 형변환해주고 각 원소를 리스트에 담기

 

+ Recent posts