백준 25206번 - 너의 평점은

백준 25206번 바로가기 나의 풀이 import sys rule={'A+':4.5,'A0':4.0,'B+':3.5,'B0':3.0,'C+':2.5,'C0':2.0,'D+':1.5,'D0':1.0,'F':0.0} score = 0.0 n = 0.0 for sbj in sys.stdin: sbj = sbj.split() if sbj[2] == 'P': pass else: score += rule[sbj[2]] * float(sbj[1]) n += float(sbj[1]) print(score/n) CODE REVIEW 문제 조건에서 20줄에 걸쳐 성적이 제공된다고 했는데, 일반적인 n줄의 성적에도 적용할 수 있도록 범용성을 높이기 위해 for sbj in sys.stdin:으로 계속해서 input을 받아주었다. 나의 경우 rule이라는 학점에 대한 정보를 dict에 담았는데, 다른 코드들을 살펴보니 g=['P','F','D0','D+','C0','C+','B0','B+','A0','A+'] 이런 리스트를 만들고 g.index(grade) * 0.5하는 식으로 학점을 구했다. 그런데 사실 이건 list보다 dict이 깔끔하지 않나 생각된다.

2023-5-13 · 1 min · 90 words · Junha

백준 10811번 - 바구기 뒤집기

백준 10811번 바로가기 백준 10813 - 공 바꾸기의 연장선 격인 문제. 범위 안의 전체 요소를 뒤집는 알고리즘만 짜면 간단하다. 나의 풀이 f=lambda:map(int,input().split()) n,m=f();*b,=range(n+1) for i in range(m): i,j = f() while i<j: b[i], b[j] = b[j], b[i] i+=1 j-=1 print(*b[1:]) m번 동안 while문의 조건 i < j 동안 교체 작업를 반복시켰다. 코드를 줄이려고 고민해봤는데 생각나지 않았다.ㅜㅜ 고수들의 풀이 참고하기! f=lambda:map(int,input().split()) n,m=f();*b,=range(n+1) exec("i,j=f();b[i:j+1]=b[j:i-1:-1];"*m) print(*b[1:]) 출처 범위를 슬라이싱해서 list[a:b] = list[b:a] 지정해주면 뒤집기가 간편하게 가능해진다. range(n+1)범위 설정에 따라 [i:j+1] [j:i-1:-1] 설정해줘야 한다.

2023-4-22 · 1 min · 80 words · Junha

백준 10812번 - 바구니 순서 바꾸기

백준 10812번 바로가기 나의 풀이 f=lambda:map(int, input().split()) n_basket, n_round = f() *ans, = range(n_basket + 1) exec("i,j,k=f();ans[i:j+1]=ans[k:j+1]+ans[i:k];"*n_round) print(*ans[1:]) 백준 10811 - 바구니 뒤집기와 매우 유사한데, k를 기준으로 뒤집어야하기 때문에 범위 설정에 유의해야 했다. 특히 python에서 슬라이싱을 할 때에 list[start:end]이면 start부터 (end-1)요소까지 범위이기 때문에 끝부분에 +1을 해줘야하는지 판단이 헷갈렸다. 그럴 땐 표나 그림을 이용하면 수월하게 해결할 수 있다. (변형 전) begin begin+1 … mid-1 mid mid+1 end-1 end i i+1 … k-1 k … j-1 j (변형 후) mid mid+1 end-1 end begin begin+1 … mid-1 k … j-1 j i i+1 … k-1 list에서 [k:j+1]과 [i:k] 범위를 잘라낸 뒤에 이어붙여, [i:j+1] 영역에 대응시키면 된다는 것을 시각적으로 확인할 수 있다. ...

2023-4-22 · 1 min · 109 words · Junha

백준 10813번 - 공 바꾸기

백준 10813번 바로가기 백준 10813 - 공 넣기와 매우 유사한 문제. input이 모두 인자가 2개여서 더 풀어내기에 수월하다. 나의 풀이 f=lambda:map(int,input().split()) n_basket,n_round=f() ans=[i+1 for i in range(n_basket)] exec("i,j=f();ans[i-1],ans[j-1]=ans[j-1],ans[i-1];"*n_round) print(*ans) 초기값에 해당하는 list를 ans 변수에 저장한 뒤에, 지정한 박스를 서로 switch 하는 과정을 구현하였다. 고수들의 풀이 참고하기! 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:]) 출처 *b=range(n+1) *b를 이용하면 [i+1 for i in range(n_basket)] for문을 이용하지 않고도 우변의 요소가 들어있는 list를 생성 가능해서 편리하다 range(n)이 아닌 range(n+1)로 지정한 이유 k번 상자에 k번 공이 들어가게 되도록 설정한 것 -> 직관적으로 파악 가능하다. 0번 상자는 존재하지 않으므로 출력을 [1:]로 슬라이싱하여 나타내면 된다.

2023-4-22 · 1 min · 95 words · Junha

백준 10810번 - 공 넣기

백준 10810번 바로가기 처음에 문제조건을 잘못 읽어서 공을 계속 추가해서 넣는 줄 알았는데, 알고보니 하나 넣으면 하나 빼는 방식이었다. 문제해결할 때에는 조건을 잘 읽고 헛으로 삽질하지 않도록 유의하자!! 나의 풀이 import sys n_basket, n_round = map(int, sys.stdin.readline().split()) result = [0] * n_basket for i in range(n_round): start, end, num = map(int, sys.stdin.readline().split()) for i in range(start, end+1): result[i-1] = num for i in result: print(i, end=" ") for 문을 돌려서 현재 상태를 result에 저장 후 update한 뒤에 최종 결과를 print하는 식으로 작성했다. 고수들의 풀이 참고하기! f=lambda:map(int,input().split()) n,m=f();b=[0]*n exec("i,j,k=f();b[i-1:j]=[k]*(j-i+1);"*m) print(*b) 출처 input 받을 때 매번 적어주는 것보다는 lambda를 활용해서 깔끔하게 적자! f=lambda:map(int, input().split()) 선언 후에 f()로 간편하게 불러올 수 있다. f=lambda:map(int, sys.stdin.readline().split())로도 응용가능 exec는 문자열 안의 코드를 실행하고 return하지 않는다. ““안의 내용을 m번 반복해라 i,j,k=f()로 불러오고 b의 (i-1)요소부터 (j)요소까지는 [k] 저장 print(*) ans = [1, 2, 3]일 경우 print(*ans)는 1 2 3을 출력한다. 극한의 숏코딩 p,_,*l=map(int,open(0).read().split()) L=[0]*p while l:p,q,r,*l=l;L[p-1:q]=[r]*(q-p+1) print(*L) 출처 ...

2023-4-21 · 1 min · 181 words · Junha