백준 1485번 - 정사각형

백준 1485번 바로가기 첫 번째 시도 # 입력 import sys read = sys.stdin.readline T = int(read().strip()) # 처리 for _ in range(T): d = [] for _ in range(4): x,y=map(int,read().split()) d.append((x,y)) d.sort() if d[0][0] == d[1][0] and d[2][0] == d[3][0] and d[0][1] == d[2][1] and d[1][1] == d[3][1]: print(1) else: print(0) 최종 제출 # 입력 import sys read = sys.stdin.readline T = int(read().strip()) # 처리 def l(a,b): return (a[0]-b[0])**2 + (a[1]-b[1])**2 for _ in range(T): d = [] for _ in range(4): x,y=map(int,read().split()) d.append((x,y)) length = [] for i in range(4): for j in range(i+1,4): length.append(l(d[i],d[j])) if len(set(length)) == 2: print(1) else: print(0) CODE REVIEW 첫 번째 시도에서는 정사각형이 똑바로 놓여있는 경우만 고려해서, 틀!렸!다! 정사각형의 각 변이 x,y축과 평행하지 않는 경우도 있기 때문에 다른 방법을 생각했다. 정사각형의 결정 조건은 “네 변의 길이가 동일하고, 두 대각선의 길이가 같다.“인데, 이 조건대로 길이를 확인해보았다. 점과 점 사이의 거리를 다 구하고, set()안에 집어 넣어준 뒤에 길이의 종류가 2개면 정사각형, 그 외에는 정사각형이 아님! 이라는 논리로 문제를 해결했다.

2023-6-5 · 1 min · 163 words · Junha

백준 1541번 - 잃어버린 괄호

백준 1541번 바로가기 나의 풀이 # 입력 import sys read = sys.stdin.readline eq = read().strip().split('-') ans = eq[0] if '+' in ans: ans = sum(map(int, ans.split('+'))) else: ans = int(ans) # 처리 for e in eq[1:]: if '+' in e: e = sum(map(int, e.split('+'))) ans -= int(e) print(ans) 고수의 풀이 a,*b=[sum(map(int,s.split('+')))for s in input().split('-')];print(a-sum(b)) 출처 CODE REVIEW 먼저 - 부호로 split 해준 뒤에 각각의 sum을 구하고 차례대로 빼주면 최솟값을 얻을 수 있다. 고수의 풀이를 보면 a-sum(b)로 풀어내었는데, for문을 한 번만 써도 풀어냈다…! 깔끔하구만

2023-6-5 · 1 min · 83 words · Junha

Projects

Junha의 Portfolio 모음집! 더 자세한 내용들은 ecrire06 repository를 참고해주세요. Lost Cities Calculator 보드게임 Lost-Cities의 점수 계산을 편리하게 할 수 있습니다. 구현된 모습은 여기를 참고해주세요 짭 군돌이 친구들의 군 생활이 얼마나 남았는지 한 눈에 파악할 수 있습니다. PenFan 연필 블로그 Django을 이용해서 연필 블로그를 만들었습니다. 접속하는데 5초 정도 소요될 수 있습니다. Github Repository 바로가기

2023-6-4 · 1 min · 53 words · Junha

백준 11659번 - 구간 합 구하기 4

백준 11659번 바로가기 첫 번째 시도 # 입력 import sys read = sys.stdin.readline n,m = map(int,read().split()) arr = list(map(int,read().split())) # 처리 for _ in range(m): i,j = map(int,read().split()) print(sum(arr[i-1:j])) 두 번째 시도 # 입력 import sys read = sys.stdin.readline n,m = map(int,read().split()) nums = {} for index, num in enumerate(map(int,read().split())): nums[index+1] = num print(nums) # 처리 for _ in range(m): temp = 0 i,j = map(int,read().split()) for k in range(i,j+1): temp += nums[k] print(temp) 세 번째 시도 # 입력 import sys read = sys.stdin.readline n,m = map(int,read().split()) arr = [0] + list(map(int,read().split())) for i in range(1,len(arr)): arr[i] = arr[i-1] + arr[i] # 처리 for _ in range(m): temp = 0 i,j = map(int,read().split()) print(arr[j] - arr[i-1]) CODE REVIEW 첫 번쨰 시도는 시간초과로 실패했다. list에서 조회하는데 시간이 오래 걸리는듯: 시간복잡도 O(n^2) 두 번쨰 시도는 list대신 dict를 사용했는데, 여전히 시간초과 발생하더라… pypy3로 돌려도 마찬가지. 계속 시간초과의 수렁에 빠져서 알고리즘 분류를 참고했다. 누적 합(prefix sum)이라고 나와있는데, $\sum\limits_{i=i}^j = S_{j} - S_{i-1}$ 로 구하는 식이다.

2023-6-4 · 1 min · 161 words · Junha

백준 11726번 - 2xn 타일링

백준 11726번 바로가기 나의 풀이 # 입력 import sys read = sys.stdin.readline arr = [1, 2, 3] + [0]*1000 # 처리 for i in range(n:=int(read().strip())): arr[i+2] = (arr[i+1] + arr[i]) % 10007 print(arr[n-1]) CODE REVIEW (1*2) 한 개 또는 (2*1) 위아래로 두 개 쌓는 방식을 택할 수 있어서, n을 1, 2의 합으로 나타내는 경우의 수를 구하는 문제로 바뀐다. 점화식은 $a_{n+2} = a_{n+1} + a_{n}$ n+1에 (1*2) 한 개 넣거나, n에 (2*1) 위아래로 두 개 넣는 경우의 합으로 계산할 수 있다. cf) 피보나치 수열과 동일.

2023-6-4 · 1 min · 84 words · Junha