728x90

알고리즘 공부(C++) 83

백준 19637 IF문 좀 대신 써줘 - 파이썬

19637번: IF문 좀 대신 써줘 (acmicpc.net) 19637번: IF문 좀 대신 써줘 첫 번째 줄에는 칭호의 개수 N (1 ≤ N ≤ 105)과 칭호를 출력해야 하는 캐릭터들의 개수 M (1 ≤ M ≤ 105)이 빈칸을 사이에 두고 주어진다. (1 ≤ N, M ≤ 105) 두 번째 줄부터 N개의 줄에 각 칭 www.acmicpc.net 이분탐색.. 잘 해오고있었는데 갑자기 뙇 어려운 문제 봉착.. 근데 자꾸 시간초과가 뜨는것임 ;; 이분탐색으로 했는데도 ..... 그래서 찾아보니 따로 함수를 만들고 조건에 해당될 떄만 불러오는게.. 아무래도 시간을 덜 쓰는듯 싶다. import sys N, M = map(int, sys.stdin.readline().split()) rank = [sys.std..

백준 1343 폴리오미노

1343번: 폴리오미노 (acmicpc.net) 1343번: 폴리오미노 첫째 줄에 사전순으로 가장 앞서는 답을 출력한다. 만약 덮을 수 없으면 -1을 출력한다. www.acmicpc.net 하하.. 그리디였는데 그리디는...... 효율적이면 대수인 유형이지. str = input() cnt = 0 dot = 0 lst = [] lst2 = [] for i in range(len(str)): if str[i] == 'X': cnt += 1 elif str[i] == '.': if cnt != 0: if cnt % 2 == 1: break lst.append(cnt) cnt = 0 lst.append('.') lst.append(cnt) if cnt % 2 == 1: print(-1) else: for i ..

백준 2805 나무 자르기 - 이분 탐색

2805번: 나무 자르기 (acmicpc.net) 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보 www.acmicpc.net 이분탐색으로 푼 첫 문제였다. N, M = map(int, input().split()) lst = list(map(int, input().split())) for j in range(max(lst) - 1, 0, -1): new_lst = [lst[i] - j if lst[i] - j > 0 else 0 for i in range(len(lst))] if sum(new_l..

백준 1935 후위 표기식2 ( stack )

1935번: 후위 표기식2 (acmicpc.net) 1935번: 후위 표기식2 첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이 www.acmicpc.net 이런 식으로 후위표기 계산을 해야하는 문제.. 우선 후위표기식이 어떻게 계산되는가를 아는것이 중요했다. 후위표기식은 앞에서부터 괄호를 만들어가면서 왼쪽 두 수에 오른쪽 기호를 대입해 계산해나가는 방식. 예제는 A + ( B * C ) / ( D - E ) 이런 식으로 나타낼 수 있다. 어떻게 계산하는지 알고 난 후 이를 어떤 식으로 묶어서 계산해나가야할지 막막했는데 스택을 이용하라는 힌트가 있었다. ..

백준 1874 스택 수열

1874번: 스택 수열 (acmicpc.net) 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net 스택 문제여서 겁없이 도전했던 문제.. 뭔가 알듯말듯 하면서도 좀 복잡해서 시간이 꽤나 걸렸는데 아니나 다를까 또!! 또간초과가 떠서 애를 먹었다.. import sys n = int(sys.stdin.readline()) lst = [] for i in range(n): lst.append(int(sys.stdin.readline(..

백준 2417 정수 제곱근

2417번: 정수 제곱근 (acmicpc.net) 2417번: 정수 제곱근 정수가 주어지면, 그 수의 정수 제곱근을 구하는 프로그램을 작성하시오. www.acmicpc.net 여러모로 날 빡치게했던 이번 문제.. 계속86까지 진행됐다가 틀렸다고 떴ㄷㅏ.. 찾아보니까 부동소수점에 해당하는 케이스땜에 틀렸다고 하는것임.. 파이썬은 float계산에서 오류를 많이 발생시킨다고 하는데 고정 소수점과는 달리 부동소수점은 안 움직인다는게 아니고 움직이는 소수점이라는것임 사실 피자를 자를때도 정확히 8등분이 아니라 한 조각이 7.99994564352434243 등분일수 잇지 않은가 그렇기 때문에 float계산에서 사실 67108864.00000000000002423435435인데 이럴 때 파이썬에서는 메모리 보호 차원..

백준 1158 요세푸스 문제 - 큐

1158번: 요세푸스 문제 (acmicpc.net) 1158번: 요세푸스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net from collections import deque N, K = map(int, input().split()) lst = [i for i in range(N, 0, -1)] deq = deque(lst) lst2 = [] while len(deq) > 0: for i in range(K - 1): deq.appendleft(deq.pop()) lst2.append(str(deq.pop())) print('') 1 2 3 4 5 6 7 이 동그랗게 앉아있을 때 K가 3이면 +3씩 깡충 뛰기 해서 3 6..

백준 10816 숫자카드 2 - 딕셔너리

10816번: 숫자 카드 2 (acmicpc.net) 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 어떤 숫자들에 상근이의 숫자가 몇번이나 포함되었는가를 구하는 문제였는데 보자마자 딕셔너리로 풀어야겠다! 가 떠올랐다. 하지만 계속 시간초과가 나게 되고.. import sys N = int(input()) lst = list(map(int, sys.stdin.readline().split())) M = int(input()) lst2 = list(map(int, sys.stdi..

백준 1764 듣보잡 - 차집합

1764번: 듣보잡 (acmicpc.net) 1764번: 듣보잡 첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. www.acmicpc.net N, M = map(int, input().split()) a = set() b = set() for i in range(N): a.add(input()) for i in range(M): b.add(input()) c = sorted(list(a.intersection(b))) print(len(c)) print('\n'.join(c)) 간단하지만 알아둘 필요가 있는 문제. 딱 봤을때부터 교집합 구하는 문제였는데 ..

백준 2609 최소공배수 최대공약수

2609번: 최대공약수와 최소공배수 (acmicpc.net) 2609번: 최대공약수와 최소공배수 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다. www.acmicpc.net 브론즈인데도 어렵다고 느껴졌던 . ... a, b = map(int, input().split()) tmp = 0 for i in range(min(a,b), 0, -1): if a % i == 0 and b % i == 0: tmp = int(i) break print(tmp) print(tmp * (a // tmp) * (b // tmp)) 아이디어의 키포인트는 우선.. 1.a랑 b중에 더 적은 값을 기준으로 계속 내려가면서 처음으로 두 값에 나머지가 0이 되는 값..

728x90