-문제: https://www.acmicpc.net/problem/4796

 

4796번: 캠핑

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

www.acmicpc.net

 

-정답풀이:

def camp(l,p,v):
    ans=0
    s=0
    k=0
    s=v//p
    k=min(v%p,l)
    ans=(l*s)+k
    return ans
a=1

while(True):
    l,p,v=map(int,input().split())
    if l==0 and p==0 and v==0:
        break
    print("Case %d: %d" %(a,camp(l,p,v)))
    a+=1

 

-틀린풀이: 

  • 6번,11-13번 라인을 잘 몰라서 틀렸던 문제.
  • 이제 테스트케이스가 주어지지 않는 경우는 while(True): if~:break문을 사용하도록 하자
  • 6번 같은 경우는 남아있는 캠핑일수와 원래 캠핑 이용하는 횟수를 비교해 최솟값을 넣어야한다 

 

-문제: https://www.acmicpc.net/problem/1339

 

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

www.acmicpc.net

개인적으로 어려웠던 문제. 딕셔너리를 사용해서는 처음 풀어보았다. 좀 더 공부하자!

-정답풀이: 

n=int(input())

alpha=[] #단어를 저장할 리스트
alpha_dict={} #단어 내의 알파벳별로 수를 저장할 딕셔너리
numList=[] #수를 저장할 리스트

for i in range(n):
    alpha.append(input().rstrip())
    
for i in range(n):#모든 단어에 대해서
    for j in range(len(alpha[i])): #i번째 단어의 길이만큼 실행
        if alpha[i][j] in alpha_dict: #단어의 알파벳이 이미 dict에 있다면
            alpha_dict[alpha[i][j]] += 10**(len(alpha[i])-j-1)    
        else: 
            alpha_dict[alpha[i][j]] =10**(len(alpha[i])-j-1)
        
for val in alpha_dict.values(): #dict에 저장된 수들(밸류들)을 모두 numList에 추가
    numList.append(val)
    
numList.sort(reverse=True)#수들 큰수부터(내림차순으로) 정렬

s=0
pows=9
for i in numList:
    s+= pows*i
    pows-=1
print(s)
  • 입력되는 단어들을 리스트로 입력하고
  • 각 알파벳의 위치에 맞는 10승을 딕셔너리에 대입한다('A': 10^5)
  • 딕셔너리의 밸류들을 numList에 대입한 후 큰 순서로 정렬한다
  • 그리고 큰 것부터 pows를 곱해가면서 더하면된다(이때 pows는 단계마다 1씩 줄어든다)

-문제: https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

일반 리스트로 구현하는 건줄 알았는데 우선순위 큐를 사용했어야하는 문제다

 

 

-정답풀이: 

import heapq
import sys
input=sys.stdin.readline

n=int(input())
ans=[]
for _ in range(n):
    ans.append(int(input()))
result=0
heapq.heapify(ans)
while len(ans)>1:
    a=heapq.heappop(ans)
    b=heapq.heappop(ans)
    heapq.heappush(ans,a+b)
    result+=(a+b)
print(result)

 

-처음 보는 부분 공부:

 

-> heapq 모듈은 이진트리 기반의 최소 힙(min heap) 자료구조를 제공한다. 최솟값만 필요할 때 사용하면된다 

-> heapq.heappop(): 힙에서 원소를 삭제할 때 사용. 원소를 삭제할 대상 리스트를 인자로 넘기면, 가장 작은 원소를 삭제 후에 그 값을 리턴한다. 위에서는 최솟값을 a와 b에 입력한다. 

->heapq.heappush(x,y): x에 y값을 넣는다. 여기서는 최솟값인 a와 b의 합인 a+b를 넣는다 

->a,b값 없애고 a+b 값을 넣는 구조 

 

-틀린풀이:

 

  • 이 풀이는 왜 안되는지 공부를 좀 해야할 것 같다 

 

-문제:https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

이맞왜틀이었던 문제. 나중에 무엇이 문제였는지 다시 풀어봐야할 것 같다

 

-정답풀이:

  • 20번 라인을 익혀야할 것 같다 
import sys

T = int(input()) #테스트케이스

for i in range(0,T):
    Cnt = 1
    people = []
    
    N = int(input())
    for i in range(N):
        Paper, Interview = map(int,sys.stdin.readline().split())
        people.append([Paper, Interview])

    people.sort() # 서류 기준 오름차순 정렬
    Max = people[0][1]
    
    for i in range(1,N):
        if Max > people[i][1]:
            Cnt += 1
            Max = people[i][1]

    print(Cnt)

-틀린 풀이:

+ Recent posts