백준 실버 1

안정은·2022년 12월 29일

코딩테스트

목록 보기
7/10

백준 실버 1 모음

11497 통나무 건너뛰기

https://www.acmicpc.net/problem/11497
아이디어는 빨리 생각했으나 반례를 못 찾아서 해맨 문제 :(
반례 찾은 방법 : 아무 숫자나 치기 ㅋ 1 5 89 4 4 5 2 1 9 12
위 반례는 최소 난이도가 77로 나오기에 abs함수를 적용해서 80이 나오게 해야한다!
파이썬 리스트에서 일정 간격으로 일부만 추출하고 싶을 땐 list[::간격]

for _ in range(int(input())):
  input()
  l=sorted(map(int,input().split()))
  l=l[0::2]+l[1::2][::-1]
  s=0
  print(*l)
  for i in range(len(l)-1):
    s=max(s,abs(l[i+1]-l[i]))
  print(s)

1931 회의실 배정

https://www.acmicpc.net/problem/1931
이건 풀이를 봤다... 조금만 더 생각하면 풀 수 있었는데 아쉽다... 핵심은 어떤 것을 기준으로 정렬할까였다. 휴 정말 아쉽다. 전에 주유소는 잘 풀었는데 넘 허무해

l=[]
c=1
n=int(input())
for _ in range(n):
  a,b=map(int,input().split())
  l.append((b,a))
l.sort()

pre=l[0][0]
for i in range(len(l)-1):
  if pre<=l[i+1][1]:
    pre=l[i+1][0]
    c+=1
print(c)

for문 더 멋지게 쓰기!

pre=c=0
for i,j in l:
  if pre<=j:
    pre=i
    c+=1
print(c)
  1. for문에서 2개 이상의 변수를 꺼낼 수 있다. 튜플 하나씩 접근할 때 l[i][0], l[i][1] 이 방법으로 안 해도 된다.

  2. c = 0인 이유. 왜 전에는 c = 1로 했는가?
    첫 시도에서는 pre=l[0][0]이고, l[i+1]부터 접근을 해서 맨 첫번째 값은 카운팅에 안 들어갔다. 그래서 1부터 숫자를 센 것이다. 그러나! 새 코드는 아예 pre=0부터 시작한다! 이전 끝값이 0이므로 다음 시작값보다 무조건 작거나 같아서 항상 if분기를 탄다. 맨 처음 리스트값도 카운팅을 하게 된다!

  3. key 2개로 튜플 정렬하기
    0번째 원소로 정렬하고, 같으면 1번째 원소로 정렬하기
    l.sort(key=lambda x:(x[0],x[1]))
    이 문제 풀 때 2번 정렬해야한다는데 나는 아예 입력을 반대로 받았다.

다 정리하고 보니 아깝게 못 푼 게 아닐지도?ㅋㅋ 방법이야 아까웠지만 이 문제를 잘 풀었다면 문법이나 실행로직을 파악하지 못 했을 듯 ㅋㅎㅎ 다음엔 좀더 짜임새 있게 가보자고~!

profile
ㅎㅇ

0개의 댓글