백준 10813번: 공바꾸기

2023. 8. 20. 13:57개인활동/코테

n, _, *l = map(int, open(0).read().split())
L = [i+1 for i in range(n)]
while l: i, j, *l = l; L[i-1], L[j-1] = L[j-1], L[i-1]
print(*L)

끼얏호

 

여기서 중요한 것은 바로 저 뒤에 있는

L[i-1], L[j-1] = L[j-1], L[i-1]

이 부분이다.

 

각 위치에 있던 값들을 바꿔서 대입해줄 수 있는 방식이다.

 

내가 왜 틀렸었나 생각했는데 서로 값을 바꿔주어야 하는 것을 제대로 하지 못했었다.

 

 

그러면 숏코드 분석도 ㄱ

 

이번엔 숏코드를 좀 여러개 가져와서 비교해보고자 하였다.

제일 상단에 있는 형태와 내 코드가 점점 비슷해져가고 있어서 혹시나 다른 형태가 존재하는지도 봐야할 것 같다.

n,m,*l=map(int,open(0).read().split())
*r,=range(n+1)
while l:a,b,*l=l;r[a],r[b]=r[b],r[a]
print(*r[1:])
N,M,*l=map(int,open(0).read().split())
*A,=range(N+1)
while l:i,j,*l=l;A[i],A[j]=A[j],A[i]
print(*A[1:])

일단 위의 두 코드에서 궁금한 것부터 정리해보자.

1. "*변수,"에서 콤마가 찍혀있는 이유는?

2. i, j를 그대로 사용해도 되는 이유는?

3. 출력 시 0번째를 제외하는 이유는?

f=lambda:map(int,input().split())
n,m=f();*b,=range(n+1)
exec("i,j=f();b[i],b[j]=b[j],b[i];"*m)
print(*b[1:])

마지막 코드는 무려 40ms밖에 안걸린 코드...

여기서 궁금한 것도 이어서 정리해보자.

4. exec는 무엇인가?

5. lambda식에서 매개변수가 없는 이유는?

 

그렇다면 궁금한 점들을 해결해보자.

 

1. "*변수,"에서 콤마가 찍혀있는 이유는?

,를 찍으면 튜플로 만들어준다고 한다.

 

해결완

 

2. i, j를 그대로 사용해도 되는 이유는?

0번째의 경우에는 있으나마나 한 존재, 0이 들어간 상태에서 그 어떠한 조작도 되지 않기에 그냥 써도 되는 것이다.

 

3. 출력 시 0번째를 제외하는 이유는?

필요 없는 값이니까!

 

4. exec는 무엇인가?

문자열로 표현된 문(statement)를 파라미터로 입력받으면 파이썬 컴파일러가 바로 해석해 실행한다고 한다.

(참고 링크: https://nan491.tistory.com/entry/Python-3-eval-%ED%95%A8%EC%88%98%EC%99%80-exec-%ED%95%A8%EC%88%98)

 

근데 statement가 무엇인지 궁금해 찾아보니 우리가 일반적으로 반복'문', 조건'문' 할 때 그 '문'이였다.

(참고 링크: https://velog.io/@kkojae91/%EA%B0%92value-%EC%8B%9Dexpression-%EB%AC%B8statement%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%84%EB%8A%94%EA%B0%80)

 

신기하다. 컴파일러가 바로 해석할 수 있도록 해주어서 시간이 더 단축된걸까?

 

5. lambda식에서 매개변수가 없는 이유는?

없어도 됨! 단 콜론 뒤에는 무조건 반환값이 존재해야 한다.

(참고링크: https://dojang.io/mod/page/view.php?id=2359)

 


악! 알아가면 알아갈 수록 어려운 것 같다.

 

'개인활동 > 코테' 카테고리의 다른 글

백준 3052번: 나머지  (0) 2023.08.23
백준 5597번: 과제 안 내신 분..?  (0) 2023.08.23
백준 10810번: 공넣기  (0) 2023.08.20
백준 2562번: 최댓값  (0) 2023.08.19
백준 10818번: 최소, 최대  (0) 2023.08.18