백준 실버 4

안정은·2022년 10월 26일

코딩테스트

목록 보기
4/10

백준 실버 4 모음

11508 2+1 세일

https://www.acmicpc.net/problem/11508
처음 코드는 시간초과 났는데 왜일까? input() 문제일까

import sys
input=sys.stdin.readline
l=sorted([int(input()) for _ in range(int(input()))])[::-1]
s=c=0
for i in l:
  s+=i if c%3!=2 else 0
  c+=1
print(s)

enumerate를 왜 쓰나 했더니 count 대신 인덱스를 가져온 거구나 ㄹㅈㄷ

print(sum(x for i,x in enumerate(sorted(l)[::-1])if i%3!=2))

1302 베스트셀러

https://www.acmicpc.net/problem/1302

l=[]
r=set()
for _ in range(int(input())):
  l.append(input())
for i in l:
  r.add((l.count(i),i))
print(sorted(r,key=lambda x:(-x[0],x[1]))[0][1])

# 이게 무슨 뜻일까 다음에 확인하기!!
sorted(l,key=lambda x:(-l.count(x),x))[0]

10825 국영수

https://www.acmicpc.net/problem/10825
정렬조건이 여러 개이고 각각 정렬기준이 오름차순, 내림차순으로 섞여있다면 key에 부호 -를 붙여 정렬하기

  • 기본값 : 오름차순 정렬
  • - : 내림차순 정렬
    key=lambda x:(-x[1],x[2],-x[3],x[0])
N=int(input())
l=[]
for _ in range(N):
  n,k,e,m = input().split()
  l.append((n,int(k),int(e),int(m)))
l.sort(key=lambda x:(-x[1],x[2],-x[3],x[0]))
for i in l:
  print(i[0])

3036 링

https://www.acmicpc.net/problem/3036

import math
input()
l=input().split()
a=int(l[0])
for i in l[1:]:
  i=int(i)
  g=math.gcd(a,i)
  print(f'{int(a/g)}/{int(i/g)}') # 이거 말고!!
  print(f'{a//g}/{i//g}')

이렇게 풀었는데 제발!!!! 정수가 필요하다면 int() 대신 // 써라!! 무려 8바이트 차이다.... :(

1158 요세푸스 문제

https://www.acmicpc.net/problem/1158
전에 푼 11866 문제랑 뭐가 다른가 했더니 deque 라이브러리를 쓰라는 문제였나? 리스트는 느리군...! 숏코딩은 뭐 난리났더만ㅋㅋ; 얼른 짱이 되어야지

from collections import deque
a,b = map(int,input().split())
l=deque(range(1,a+1))
r=[]
while l:
  for i in range(b-1):
    l.append(l.popleft())
  r.append(l.popleft())
print(str(r).replace('[','<').replace(']','>'))

1065 한수

https://www.acmicpc.net/problem/1065
아직 코드 짜는 논리가 부족한 것 같다. 저 if i==1000은 없어도 되는데 왜 넣었을까 ㅋㅋㅋ 가끔 이런 없어도 되는 코드를 넣는 것 같은데 풀다보면 나아지겠지...! 이걸로 알게 된 것은 분기도 실행횟수에 들어간다! 분기를 빼면 36ms인데 있으면 40ms였다! 쓸데없는 분기는 넣지말자! 실행속도 늘어난다!!!

n=int(input())
if n<100:
  print(n)
else:
  c=99
  for i in range(100,n+1):
    if i==1000: # 굳이싶은 분기
      break
    i=str(i)
    if int(i[0])-int(i[1])==int(i[1])-int(i[2]):
      c+=1
  print(c)

2847 게임을 만든 동준이

https://www.acmicpc.net/problem/2847
이거 거의 바로 풀었다~! 대충 20분 걸렸나 체감상 10분 안에 푼 듯ㅋ 근데 왜 성공이라고 안 뜨지... :(

l = []
i=c=0
for _ in range(n):
  l.append(int(input()))
while i!=n-1:
  if l[i] >= l[i+1]:
    l[i]-=1
    c+=1
    i=0
  else:
    i+=1
print(c)

l = [int(input()) for i in range(int(input()))]
이렇게 한 줄로 개행 입력을 받을 수 있군!

1049 기타줄

https://www.acmicpc.net/problem/1049
푸는 방법은 빨리 생각해냈으나... 패키지가 낱개보다 더 비싼 경우는 고려 못 했다. 당연한 거 아님? 누가 낱개를 더 싸게 팔아! ☹️☹️

n,m = map(int,input().split())
A,B = [],[]
for _ in range(m):
  a,b = map(int,input().split())
  A.append(a)
  B.append(b)
A.sort()
B.sort()
q=n//6
r=n%6

if A[0]>6*B[0]:
  print(n*B[0])
else:
  ans=(q+1)*A[0] if r*B[0]>A[0] else q*A[0]+r*B[0]
  print(ans)

9012 괄호

https://www.acmicpc.net/problem/9012
강의 보고 풀었는데 코드길이 242 실화냐 ㅋㅋㅋㅋㅋ

n=int(input())
for k in range(n):
  l=[]
  r=0
  s = input()
  for p in s:
    if p =='(':
      l.append(p)
    else:
      try:l.pop()
      except:
        r=1
        break
  if len(l)==0 and r==0:
    print('YES')
  else:
    print('NO')

ㅋㅋㅋㅋ아니 ㄹㅈㄷ... 스택을 안 쓰고 푸니까 짧지... 이런 멋쟁이들!

N = int(input())
for i in range(N):
    a = input()
    while "()" in a:
        a = a.replace("()","")
    if a == "":
    	print("YES")
    else:
    	print("NO")

10610 30

https://www.acmicpc.net/problem/10610
그리디 문제라고 해서 하나하나 다 해보는 건 줄 알았는데 정수론으로도 풀 수 있대서 어찌저찌 풀다가 숏코딩을 보니...

import itertools
n = sorted(input(),reverse=True)
l = sum(map(int,n))

if l%3==0 and n.count('0'):
  r = []
  for i in itertools.permutations(n,len(n)):
    l = list(i)
    s = int(''.join(l))
    if s%30==0:
      print(s)
      break
else:
  print(-1)

그냥 수를 정렬해서 30의 배수인지만 확인하면 됨... 애초에 다 돌릴 필요없이 내림차순정렬한 첫 번재 값이 답임...굳이 itertools 라이브러리 안 써도 됨...ㄹㅈㄷ

n = sorted(input(),reverse=True)
l = sum(map(int,n))
if l%3==0 and n.count('0'):
  print(''.join(n))
else:
  print(-1)

2217 로프

https://www.acmicpc.net/problem/2217
오~ 쉽게 빨리 잘 풀었다~!~!

n = int(input())
l = []
for _ in range(n):
  l.append(int(input()))
l.sort()
ans = 0
k = 0
for i in l:
  ans = max(i*(len(l)-k),ans)
  k+=1
print(ans)

1026 보물

https://www.acmicpc.net/problem/1026

n = input()
l = sorted(map(int,input().split()))
l2 = sorted(map(int,input().split()),reverse=True)
s = 0
for i in range(len(l)):
  s += l[i]*l2[i]
print(s)

11047 동전 0

https://www.acmicpc.net/problem/11047

n, m = map(int, input().split())
l = [int(input()) for _ in range(n)]
s = 0
for i in l[::-1]:
  r = m // i
  if r == 0:
    continue
  else:
    s += r # 여기서 r을 더하는데 0이어도 상관없구나! 계속 이걸로 코드 늘어나네 ㅋㅋ;;
    m %= i
print(s)

11399 ATM

https://www.acmicpc.net/problem/11399

n = int(input())
l = sorted(map(int,input().split()))
s = 0
for i in range(len(l)):
  s += sum(l[:i+1])
print(s)

10845 큐

https://www.acmicpc.net/problem/10845
이게 최선이다.

import sys

n = int(input())
res = []

for _ in range(n):
  s = sys.stdin.readline().split()
  
  if len(s)>1:
    num = int(s[1])
    
  if s[0] == 'push': res.append(num)
  elif s[0] == 'pop':
    if not res: print(-1)
    else: print(res.pop(0))
  elif s[0] == 'size': print(len(res))
  elif s[0] == 'empty':
    if not res: print(1)
    else: print(0)
  elif s[0] == 'front':
    if not res: print(-1)
    else: print(res[0])
  elif s[0] == 'back':
    if not res: print(-1)
    else: print(res[-1])

음~ 삼항연산자로도 할 수 있군

print(q[-1] if res else -1)
profile
ㅎㅇ

0개의 댓글