백준 실버 1 모음
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)
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)
for문에서 2개 이상의 변수를 꺼낼 수 있다. 튜플 하나씩 접근할 때 l[i][0], l[i][1] 이 방법으로 안 해도 된다.
c = 0인 이유. 왜 전에는 c = 1로 했는가?
첫 시도에서는 pre=l[0][0]이고, l[i+1]부터 접근을 해서 맨 첫번째 값은 카운팅에 안 들어갔다. 그래서 1부터 숫자를 센 것이다. 그러나! 새 코드는 아예 pre=0부터 시작한다! 이전 끝값이 0이므로 다음 시작값보다 무조건 작거나 같아서 항상 if분기를 탄다. 맨 처음 리스트값도 카운팅을 하게 된다!
key 2개로 튜플 정렬하기
0번째 원소로 정렬하고, 같으면 1번째 원소로 정렬하기
l.sort(key=lambda x:(x[0],x[1]))
이 문제 풀 때 2번 정렬해야한다는데 나는 아예 입력을 반대로 받았다.
다 정리하고 보니 아깝게 못 푼 게 아닐지도?ㅋㅋ 방법이야 아까웠지만 이 문제를 잘 풀었다면 문법이나 실행로직을 파악하지 못 했을 듯 ㅋㅎㅎ 다음엔 좀더 짜임새 있게 가보자고~!