알고리즘2023. 2. 21. 23:21
728x90

[ 문제 ]

https://softeer.ai/practice/info.do?idx=1&eid=395 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

 

[ 코드 ]

w,n = map(int,input().split())

jewerly = [list(map(int,input().split())) for _ in range(n)]
#금속무게 Mi, Pi가 들어오면 우선 map(int,input().split())으로 각각 정수로 받음
# -> 정수 Mi, Pi를 리스트로 묶음 ex. [Mi, Pi]
# -> [Mi, Pi]리스트를 n개 만듦 (파이썬 2차원 리스트) //https://mminky.tistory.com/141

jewerly.sort(key=lambda x: x[1],reverse=True)
# 리스트 jewerly를 정렬할거임.
# 이때, 기준x의 형태는 x[1]임. 즉, 가격인 Pi를 기준으로 정렬함.
# [Mi, Pi]에서 'Mi의 인덱스는 [0]', 'Pi의 인덱스는 [1]'이기 때문.
# reverse=True를 통해 오름차순 정렬. //https://mminky.tistory.com/170

sum_price = 0
for mi, pi in jewerly: # 리스트 jewerly에 있는 모든 mi,pi에 대해 수행
    # 지금넣는무게 <= 전체가방무게
    if mi <= w :
        sum_price += mi*pi #해당 item을 해당 price만큼
        w -= mi #item넣고 남은 무게로 w 갱신
    # 지금넣는무게 > 전체가방무게
    else:
        sum_price += w*pi #item넣고 남은 무게인 w를 해당 price만큼
        break #남은가방무게 보다 큰 애들이 나오면 끝

print(sum_price)

 

 

[ 해결 아이디어 ]

우선 이 문제는 몇 번 틀렸었다.. 그래서 코드별로 정리해보는 아이디어 노트!

 

1. 리스트 정렬

jewerly.sort(key=lambda x: x[1],reverse=True)

(오답노트)

처음에는 아래 처럼 딕셔너리를 이용해서 정렬을 했다.

# sort_dic_value = list(sort_dic.keys())
# sort_dic_weight = list(sort_dic.values())

 

하지만 문제는 딕셔너리는 중복이 안 된다.

따라서 [무게, 가치]라고 했을 때, [90, 2] 다음에 [70, 2]가 들어온다면

[90, 2]에 대한 정보는 사라지고 [70, 2]로 갱신되어 버린다.

그래서 값이 틀려진다.

위에 첨부한 코드대로 리스트 정렬을 하자!

 

2. break 

    # 지금넣는무게 > 전체가방무게
    else:
        sum_price += w*pi #item넣고 남은 무게인 w를 해당 price만큼
        break #남은가방무게 보다 큰 애들이 나오면 끝

(오답노트)

처음에는 else에 break를 쓰지 않았다.

그 결과 테스트케이스를 돌려보니 runtime error가 났다.

 

for mi, pi in jewerly: 라는 for문을 이용하게 되면 가방 안에 모든 무게를 다 넣어도

jewerly리스트 내의 모든 [mi,pi]에 대해서 반복문을 실행한다.

그래서 가방무게를 초과해서 계산하기도 한다.

어차피 지금 넣는 무게 > 전체 가방 무게 라면 전체가방 만큼만 쪼개어 넣으면 끝이기 때문에

break를 해줘서 for문을 끝내주자!

 

 

[ 결과 ]

반응형
Posted by mminky
알고리즘2023. 1. 14. 18:10
728x90

[ 문제 ]

https://softeer.ai/practice/info.do?idx=1&eid=362 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

[ 코드 ]

n = int(input())

for i in range(n):
    a,b = map(int,input().split(' '))
    sum = a+b
    print("Case #%d: %d" %(i+1,sum))

 

[ 해결 아이디어 ] - 형식 지정 출력

 

* 문제 발생

처음에는 다음과 같은 코드로 print 했다.

print("Case #",i+1," ",sum)

 

하지만 print( , , )는 각 인자들을 띄어쓰기로 연결한다.

얼핏 보기에는 맞아보였지만 코드를 돌려보니 띄어쓰기가 틀렸다.

(노란색으로 표시한 부분이 print문을 ','를 이용 했을 때 발생하는 띄어쓰기이다.)

 

* 해결

그래서 형식을 지정해서 출력하는 방법으로 다시 시도했다.

이 방법은 따옴표 안에 원하는 형식으로 쓰고 거기에 들어가는 변수를 지정해주는 방법이다.

 

즉, Case #1: 2 이렇게 표현하고 싶다면 print 구문 안에 Case #%d%d 이렇게 적어주면 된다. (%d는 정수를 의미)

그리고 뒤에오는 %에는 순서대로 %d에 넣을 변수를 입력해준다.

 

print("Case #%d%d%(i+1,sum))

 

간단하게 실행 결과를 보여주면 다음과 같다.

i = 0
sum = 2
print("Case #%d: %d" %(i+1,sum))

 

-> 코드 실행 결과

    첫 번째 %d에는 i+1 값인 1이 출력되었다.

    두 번째 %d에는 sum 값인 2가 출력되었다.

 

 

[ 결과 ]

반응형
Posted by mminky
알고리즘2023. 1. 14. 17:56
728x90

[ 문제 ]

https://softeer.ai/practice/info.do?idx=1&eid=1016 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

[ 코드 ]

a,b = map(int, input().split(' '))

if a > b:
    print("A")
elif a < b:
    print("B")
else:
    print("same")

* 파이썬은 if, elif, else 구문이다.

 

[ 결과 ]

반응형
Posted by mminky
알고리즘2023. 1. 14. 17:30
728x90

[ 문제 ]

https://softeer.ai/practice/info.do?idx=1&eid=990 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

[ 코드 ]

sum = 0
for _ in range(5):

    start, finish = input().split(' ')
    start_hour, start_min = map(int,start.split(':'))
    finish_hour, finish_min = map(int,finish.split(':'))

    gap_hour = finish_hour - start_hour
    gap_hour_to_min = gap_hour * 60

    gap_min = finish_min - start_min

    sum += gap_hour_to_min + gap_min

print(sum)

 

[ 해결 아이디어 ]

시작시간과 끝나는 시간을 각각 hour와 min으로 나누었다.

이 때 주의할 점은 map(int, start.split(':')) 을 이용하여 int로 바꿔줘야된다. (계산을 위해)

 

처음에는 gap_min = finish_min - start_min을 해야되는데

09:34 18:27과 finish_min(27)이 start_min(34)보다 작은 경우에는 어떻게 하지 라는 생각을 했다.

하지만 결국 일한 시간을 분으로 나타내는 것이기 때문에 27-34 = -7이 나와도 전체결과에는 문제가 없다.

 

[ 결과 ]

반응형
Posted by mminky
알고리즘2022. 2. 28. 13:29
728x90

[ 문제 ]

https://programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

 

[ 코드 ]

def solution(numbers):
    answer = ''
    
    # numbers를 문자열로 바꿔 str_num에 넣음 (사전값 정렬)
    str_num = []
    str_num = list(map(str,numbers))
    ''' (위와 같은 코드)
    for n in numbers:
        str_num.append(str(n))
    '''
    
    # numbers 원소 1000이하 이므로 x*3 (문자열 3번 반복)
    # ex. 3 vs 30을 333 vs 303030으로. 앞에서 부터 비교하면 303<333
    # 즉, 사전순 오름차순이었으면 3->30임. 하지만 *3하면 30->3
    str_num.sort(key=lambda x: x*3, reverse = True)
    # sort에서 key값을 기준으로 정렬. 이때 lambda함수 이용가능
    
    # 0000을 '0' 으로 출력하기 위해 int -> str로 변경
    answer = str(int(''.join(str_num)))
    return answer

 

* 마지막에 answer = ''.join(str_num) 이렇게만 했더니 딱 하나의 테스트 케이스가 통과되지 않았다.

그래서 검색을 해보니 int로 변경 후 str로 변경해야 한다고 했다.

특히 '0000'의 경우 실제로는 '0'인데 int로 변경하지 않으면 '0000'으로 나온다.

 

* ''.join(str_num)''를 기준으로 str_num의 원소들을 합쳐라는 의미 이다.

여기서는 따옴표 안에 아무 것도 없기에 연속으로 합쳐라는 의미 이다. (ex. 6210)

문자 +을 기준으로 합치고 싶다면 '+'.join(str_num) 이렇게 이용 가능 하다. (ex. 6+2+10)

반응형
Posted by mminky
알고리즘2022. 2. 27. 22:01
728x90

* 정렬은 출제 빈도높고, 평균 점수높다고 한다. (출처 : 프로그래머스)

 

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

 

[ 문제 ]

https://programmers.co.kr/learn/courses/30/lessons/42748

 

코딩테스트 연습 - K번째수

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

programmers.co.kr

 

[ 코드 ]

def solution(array, commands):
    answer = []
    # com을 읽어온다. ex.[2, 5, 3]
    for com in commands:
        a, b, c = com
        ''' (위와 같은 코드)
        a = com[0]   ex. 2
        b = com[1]   ex. 5
        c = com[2]   ex. 3
        '''
        
        # 리스트 슬라이싱을 [시작:끝] 이렇게 했다면 시작~끝-1까지 담김
        arr = array[a-1:b] #2~5번째임. 인덱스에서는 1~4.
        sort_arr = sorted(arr) # 정렬
        
        # answer리스트에 추가해줌
        answer.append(sort_arr[c-1])
        
        #(참고) 이런 식으로 바로 쓰기도 가능!
        #answer.append(sorted(arr)[c-1])
    return answer

 

 

[ 참고자료 ]

파이썬 리스트 슬라이싱, append 가 헷갈린다면 아래 글이 도움될 것!

https://mminky.tistory.com/121

 

[ Python ] 리스트 추가, 삭제, 슬라이싱

* 리스트 추가 .append() * 리스트 원소 삭제 .pop .remove del * 리스트 슬라이싱 1) 이용방법 이렇게 이용하면 (시작)~(끝-1)까지의 항목들이 담긴다. 리스트명[시작:끝] 이런 리스트가 있다고 가정해보자

mminky.tistory.com

 

반응형
Posted by mminky
알고리즘2022. 2. 27. 21:47
728x90

[ 문제 ]

https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

 

[ 코드 ]

def solution(clothes):
    dic={}
    c = 1
    
    # ["yellowhat", "headgear"] 이러한 items를 읽어옴
    for items in clothes:
        if items[1] in dic: # "headgear"가 이미 dic={} 안에 있다면
            dic[items[1]] += 1 # "headgear": +1
        else:               # "headgear"가 처음 나왔다면
            dic[items[1]] = 1  # "headgear" : 1
    
    #print(dic)	 #결과 {'headgear': 2, 'eyewear': 1}
    for v in dic.values(): # 여기서 2, 1을 의미
        c = c* (v+1)  # 안 쓴 경우까지 고려하기 위해 v+1
        # ex. headgear의 경우 "yellowhat", "bluesunglasses", "안 씀" (총 3가지)
        
    #for k, v in dic.items(): #(참고) 이렇게 key,value 이용 가능
    #    print(k," ",v)
    
    return c-1 # 최소 한 개 이상은 입음. 다 안 입는 경우 -1

 

경우의 수를 계산하는 법을 알아야 한다!

 

반응형
Posted by mminky
알고리즘2022. 2. 26. 23:47
728x90

[ 문제 ]

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

 

 

[ 코드 ]

def solution(phone_book):
    dic = {}
    for num in phone_book:
        dic[num] = 1 #기본 값
    
    # 각 폰 번호에 대해
    for n in phone_book: # ex. 123
        str_num = ''   
        for i in n:     # ex. 1/ 2/ 3
            str_num += i
            # 하나씩 자른게 딕셔너리에 있는지 확인 (단, 본인은 아닌거)
            if (str_num in dic) and (str_num != n):
                return False #처음에 answer=True 하고 return answer해도 되지만 이게 더 빠름
    return True
반응형
Posted by mminky