백준 1259번 - 팰린드롬수

백준 1259번 바로가기 나의 풀이 import sys for n in sys.stdin: n = n.strip() if n == '0': break else: if n != n[::-1]: print('no') else: print('yes') 고수의 풀이 while int(s:=input()):print(['no','yes'][s==s[::-1]]) 출처 CODE REVIEW 소수와 더불어 단골소재 팰린드롬수! 자신과 자신의 거울상이 동일한지를 살펴보면 되니까 n과 n[::-1]을 비교하면 된다. 고수의 풀이를 살펴보다가 print()의 새로운 기능을 알게 되었다. print(['no', 'yes'][조건문])인데 조건문 안의 내용이 True이면 두번째 요소인 ‘yes’를, False라면 첫번째 요소인 ’no’를 출력해준다. if문을 사용하지 않아도 되어서 간결해진다. :=는 바다코끼리 연산자(the walrus opeator)라고도 불리는데 같은 것을 여러번 호출하지 않아도 되도록 도와주는 연산자이다. documentation에 따르면 다음과 같을 때 유용하게 사용할 수 있다. if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)") -> len()을 두 번 호출하지 않아도 됨! ...

2023-5-14 · 1 min · 120 words · Junha

백준 15894번 - 수학은 체육과목입니다.

백준 15894번 바로가기 얼핏 보면 복잡해보이지만, 가로변과 세로변을 따로 분리하면 쉽게 규칙을 찾을 수 있다. 가로변은 $2n$의 규칙을 가지고 세로변또한 $4n$의 규칙을 가지기에 전체 길이는 $4n$이다. 아니면 굽어진 부분을 편다고 생각하면 정사각형이 된다고 생각해도 마찬가지이다. 나의 풀이 print(4*int(input()) CODE REVIEW 솔직히 블로그에 적기에 부끄러운 코드다…ㅎㅎ

2023-5-14 · 1 min · 45 words · Junha

백준 2745번 - 진법 전환

백준 2745번 문제 바로가기 내 제출 num, base = input().split() ref = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' ans = 0 len = len(num) - 1 for i in num: ans += ref.find(i) * (int(base) ** len) len -= 1 print(ans) 고수의 풀이 s,n=input().split() print(int(s,int(n))) CODE REVIEW 아니 두 줄로 이게 가능하다고?! 내 풀이가 초라해지는 순간이었다. ㅜㅜ python int에 내제된 진법 전환 기능을 활용하면 훨씬 간편하다. 진법 전환의 사용 빈도가 높아서 기본 제공되는 듯하다. 그렇더라도 ref라는 string에서 index을 읽어다가 답을 구하는 방법도 좋은 생각이니까 좌절하지 않기!

2023-5-14 · 1 min · 81 words · Junha

백준 2903번 - 중앙 이동 알고리즘

백준 2903번 바로가기 나의 풀이 논리과정 전체 점 갯수는 (각 변에 위치한 점 갯수)^2 각 변에 있는 점 갯수는 증가량이 등비수열인 계차수열 n = int(input()) dots = 2 for i in range(n): dots += 2**i print(dots**2) CODE REVIEW 위에서는 규칙에 따라 더해나갔지만, 아예 일반항을 구할 수도 있다. n번째 수열까지의 등비수열의 합은 초항이 a, 등비가 r일 때 $a(r^n-1)\over r-1$ 이므로, 문제조건을 대입하면 $2 + 1(2^n-1)\over 2-1$ = $2^n+1$ 따라서 점의 갯수는 이것을 제곱한 형태인 $(2^n+1)^2$ 로 한번에 구할 수 있다. ...

2023-5-14 · 1 min · 79 words · Junha

백준 9063번 - 대지

백준 9063번 바로가기 나의 풀이 x = [] y = [] for _ in range(int(input())): n, m = map(int, input().split()) x.append(n) y.append(m) print((max(x)-min(x)) * (max(y)-min(y))) 고수의 풀이 *l,=map(int,open(0).read().split()) s=lambda i:max(i)-min(i) print(s(l[1::2])*s(l[2::2])) 출처 CODE REVIEW 예외를 따질 필요 없이, x값중 최대에서 최소를 빼고, y도 마찬가지로 빼서 서로 곱하면 되는 간단한 문제였다. x와 y 각각에 대해 list을 만들어서 해결했는데, 메모리를 더 줄이기 위해서는 하나의 리스트로도 해결 가능하다. 고수의 풀이를 보면 3번째 줄에 l[1::2] l[2::2]와 같은 표현을 볼 수 있는데 input을 int로 계속 불러와서 list에 저장하게 되면 x값은 1번 index부터 2간격으로, y값은 2번 index부터 2간격으로 등장한다. lambda을 애용하자. s=lambda i:max(i)-min(i)로 지정하면 여러번 반복해서 작성할 필요 없이 함수처럼 불러올 수 있다.

2023-5-14 · 1 min · 107 words · Junha