-
2436. 공약수Algorithm/Baekjoon 2023. 2. 11. 01:38
하나를 놓쳐서 시간이 걸린 문제 먼저 A = a*gcd, B = b*gcd라고 놓고, lcm*gcd = A*B니까 식 전개해서 a*b = lcm//gcd여야 한다는 것까지는 파악을 했고 이 때 합이 최소가 되는 두 수여야 하기에 a와 b가 가장 가까운 숫자여야 한다는 것까지는 알았다. 그래서 a*b의 제곱근 근처에서 탐색을 시작해서 a와 b를 찾아내도록 했는데... a와 b가 서로소여야 한다는 것을 놓쳐서 바로 정답을 맞추지는 못했다. a와 b가 서로소가 아니라면 gcd가 해당 값이 아니게 되기 때문에 짚고 넘어가야 하는 조건이다. 놓치지 말기! import sys input = sys.stdin.readline def calc_gcd(a, b) : if b == 0 : return a return ca..
-
16563. 어려운 소인수분해Algorithm/Baekjoon 2023. 2. 10. 00:36
이름값하는 문제! 처음에는 에라토스테네스의 체를 그대로 이용해서 소수 목록을 만들고, 그 소수 목록의 값을 하나씩 꺼내가며 구하는 방식을 생각했으나... 답은 나오는데 계속 시간 초과가 떴다. 다른 방법은 이렇다. 각 숫자가 어떤 소인수를 가지고 있는지 알 수 있도록 해야 한다. 예를 들면 9는 3을 가지고 있도록! 가장 작은 소인수를 기억해 놓으면 원래의 숫자에서 거슬러 올라가며 소인수를 모두 가져올 수 있다. import sys input = sys.stdin.readline def era(n) : check = [0 for _ in range(n+1)] for i in range(2, n+1) : if check[i] != 0 : continue for j in range(i, n+1, i) : i..
-
2960. 에라토스테네스의 체Algorithm/Baekjoon 2023. 2. 9. 22:37
문제 잘 읽기... 에라토스테네스체를 구현해서 소수를 남기는 게 목적이 아니고, 소수도 지워버려야 한다는 것에 유의하기... 코드 depth가 너무 깊어지지 않도록 주의하기... import sys input = sys.stdin.readline def getnumber(n, k) : isPrime = [True for _ in range(n+1)] isPrime[0] = False isPrime[1] = False cnt = 0 for i in range(2, n+1) : if isPrime[i] == False : continue for j in range(i, n+1, i) : if isPrime[j] == False : continue isPrime[j] = False cnt += 1 if cnt..
-
11866. 요세푸스 문제Algorithm/Baekjoon 2023. 2. 9. 01:12
어렵지 않은 문제였고. import sys from collections import deque input = sys.stdin.readline def josephus(n, k) : circle = deque([i for i in range(1, n+1)]) i = 1 ans = [] while circle : if i % k == 0 : ans.append(circle.popleft()) else : circle.append(circle.popleft()) i += 1 return ans n, k = map(int, input().split()) print("") 위와 같이 풀었는데... deque에 rotate라는 요망한 친구가 있었음. import sys from collections import ..
-
2504. 괄호의 값Algorithm/Baekjoon 2023. 2. 8. 03:01
temp에 곱해주고 ans에 더해주는 개념까진 생각했는데 앞의 괄호 모양을 판단하여 더해준다는 생각을 못해서 고생했다. 괄호 판별은 기본적인 스택 문제와 유사하니 괄호마다 값을 할당해서 계산하는 것만 잘 생각하면 된다. import sys input = sys.stdin.readline paren = [] numbers = [] pair = {')' : '(', ']' : '['} values = {'(' : 2, ')' : 2, ']' : 3, '[' : 3} def calc(arr) : ans = 0 temp = 1 for i in range(len(arr)) : if arr[i] == '(' or arr[i] =='[' : paren.append(arr[i]) temp*=values[arr[i]] ..
-
1918. 후위표기식Algorithm/Baekjoon 2023. 2. 7. 22:31
역시 골드는 어렵구나 스택을 사용한 문제이며, 이 문제에서 고려해야 하는 것들은 이렇다. 1. 피연산자(문자)는 무조건 바로 집어넣는다. 2. 연산자는 스택에 넣는데, 이 때 우선순위가 높은 연산자는 무조건 상위에 있어야 한다. (그래야 먼저 뽑아서 정답에 집어넣을 수 있다.) 따라서 우선순위가 더 같거나 낮은 연산자를 만나면 그것보다 높은 연산자들은 모두 뽑아져야 한다. - 여기서 우선순위가 같은 연산자를 만날 때도 pop을 해야하는 이유는, 우선순위가 같더라도 새로운 연산자가 더 뒤에 나와야 하기 때문으로, 즉 우선순위가 같아도 이전의 연산자들이 먼저 뽑아져야 하는 것이다. 3. 위와 같은 작업을 위해 괄호의 우선순위는 가장 낮아야 한다. (그래야 위에 다른 연산자를 쌓을 수 있다.) 이 때, ')'..
-
1213. 팰린드롬 만들기Algorithm/Baekjoon 2023. 2. 7. 00:41
이것도 깔끔하게 풀겠다고 정답화면을 서너번은 봤다... 의식의 흐름대로 푼 초기 버전 import sys input = sys.stdin.readline def palindrome(arr) : alphabets = {} half = [] center = [] result = [] for c in arr : if c in alphabets : alphabets[c] += 1 else : alphabets[c] = 1 alphabets = sorted(alphabets.items()) for c, cnt in alphabets : if cnt%2 == 0 : half.extend([c]*(cnt//2)) elif cnt%2 != 0 and center : print("I'm Sorry Hansoo") ret..
-
4949. 균형잡힌 세상Algorithm/Baekjoon 2023. 2. 6. 23:26
코드를 깔끔하게 짜고 싶은데 잘 안되고 있어서 답답하다. 이번에도 깔끔하게 짜려고 용쓰다가 풀이하는데 생각보다 오래 걸렸음... 문제의 조건을 조금 더 꼼꼼하게 보고 생각해서 풀자 import sys input = sys.stdin.readline def check(line) : pair = [] p = {')' : '(', ']' : '['} for c in line : if c == '(' or c == '[' : pair.append(c) elif (c == ')' or c == ']') : if len(pair) > 0 and (p[c] == pair[-1]) : pair.pop() else : return False if len(pair) == 0 : return True else : retur..