분류 전체보기 562

[n15686] 연산자 끼워넣기(2) in python

초기 max값은 1 * 1e9 초기 min값은 -1*1e9 이 문제는 백트래킹 개념을 사용하면 풀 수 있다. for문을 돌려서 해야하나 잠시 고민했는데 재귀함수만 이용해도 충분히 가능했던 문제! (아직 재귀함수 사용하는 게 서투른 편..) + , - , * , / 순으로 if문 작성 (주의해야 할 부분) 또, 나눗셈은 정수 나눗셈으로 몫만 취한다. 음수를 양수로 나눌 때는 C++14의 기준을 따른다. 즉, 양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼 것과 같다. 나는 temp가 음수일 때, 양수일때를 나눠서 처리해줘야하는 줄 알았다. 그러나 파이썬 연산자만 잘 활용해도 충분히 간단하게 풀 수 있었다. 파이썬 연산자에서 나눗셈을 담당하는 연산자는 총 3가지 1. / : 나누기 2. // : 나누기 ..

카테고리 없음 2021.10.17

[n1058] 친구 in python

아휴 이 문제는 이해하는 것부터 힘들었다 ^.^; 말장난에 놀아난 1인.. 나야 나.. visited를 1차원 배열로 하려고 했는데 계속 오류가 났다 결국 더 보기 편하게 2차원으로 걍 쪼개버렸다 A B C 친구가 있다. 2-친구가 되기 위한 조건은 총 2가지 1. A, B가 서로 친구 or 2. A와 C, B와 C가 친구인 경우 아래 예시로 살펴보면 A와 B가 친구 -> 2-친구 조건1 만족o A와 C가 친구 x -> 조건1 만족x, 그러면 조건 2를 살펴본다. A와 B가 친구이고 C와 B가 친구이므로 A와 C도 친구가 될 수 있다. -> 조건2 만족o ** fucn 함수 안에 있는 조건문에서 인덱스 순서가 바뀌어도 상관 없었다 A->B랑 친구이면 B->A도 친구이기 때문! # 두사람이 친구 or (A..

[n1904] 01타일 in python

역시나 처음에 조합부터 떠오른 1인.. 하지만 시간 초과 뜰 게 뻔해서 dp로 다시 방향을 바꾸었다! 이 문제는 피보나치 수열과 매우 유사하다. n=1일때 1개 n=2일때 2개 n=3일때 3개 (1+2) n=4일때 5개 (2+3) dp[n]=dp[n-1]+dp[n-2] 그래서 간단하게 답을 도출해낼 수 있었다. 정답코드는 아래와 같다 n=int(input()) dp=[0] * 1000001 dp[1]=1 dp[2]=2 for i in range(3,n+1): dp[i]=(dp[i-1]+dp[i-2])%15746 print(dp[n]) 위 코드 같은 경우에는 시간이 473ms가 떠서 더 좋은 방식이 있나 찾아봤더니 행렬곱셈을 이용하여 피보나치 수열을 하게 되면 더 빠르게 값이 도출된다는 것을 알게 되었다...

[n1021] 회전하는 큐 in python

덱을 이용해서 양방향 배열 구현하기 연산의 종류 3가지 1. 첫 번째 배열 원소 빼내기 2. 왼쪽으로 배열 이동 3. 오른쪽으로 배열 이동 while i != array[0]: array.appendleft(array.pop()) cnt += 1 array.popleft() while문이 끝난 뒤 array.popleft()를 붙여주지 않아서 한동안 헤맸다! 문제 풀기 전에 미리 설계를 해두고 코드를 짜는 습관을 들여보자 :).. from collections import deque n, m = map(int, input().split()) array = deque([i for i in range(1, n + 1)]) location = list(map(int, input().split())) cnt =..

[n1094] 막대기 in python

합 > x 1. 가장 짧은 막대기를 절반으로 나눈 막대기를 리스트에 넣는다. (원본 막대기는 삭제) 2. 리스트 오름차순으로 정렬 3. 가장 짧은 막대기의 절반을 제외한 나머지 합계가 x보다 크거나 같으면? 가장 짧은 막대기의 절반 하나를 제거한다. 이 과정은 합==x일 때 종료 x=int(input()) array=[64] while sum(array)>x: # 합>x # 1번 min_value=min(array) # 가장 짧은 막대를 절반으로 나눈다. array.remove(min_value) array.append(min_value//2) array.append(min_value//2) array=sorted(array) if sum(array)-min_value//2 >=x: array.remov..

[n14502] 연구소 in python

너무 어렵다 ㅠㅠ 어려어ㅜ... 혼자 끙끙 고민하다가 결국 인터넷에서 풀이를 찾아봤다! 바이러스 퍼지게 하는 건 재귀함수로 하면 될 것 같았지만, 벽을 어디에 세워야할지 정하는 기준을 몰라서 헤맸던 문제 일단 바이러스가 있는 위치를 리스트로 저장하기 벽 선택하는 함수 1개 바이러스를 퍼트리는 함수 1개를 구현 1. 벽 선택하는 함수 벽 count가 3 미만인 경우와 count가 3인 경우를 나눠서 생각해줘야한다. 벽 count가 3 미만이라면? > 벽을 선택하는 과정이 들어가줘야한다. 경우의 수가 많이 없으므로 처음부터 끝까지 for문을 돌린다. (총 횟수 : n*m-start ) 현재 위치가 빈 벽이면 벽을 세우고 재귀함수를 호출! (그 자리에서부터 다시 벽을 세울 자리를 탐색) 재귀함수의 수행이 끝나..

[n14888] 연산자 끼워넣기 in python

이 문제도 역시나 백트래킹 python3로 돌리면 시간초과가 나서 pypy3로 돌렷다 ㅠㅠ 그래도 시간이 많이 나오긴 하는데 효율적인 코드를 좀 뒤져봐야 할 것 같다! n = int(input()) array = list(map(int, input().split())) operator = list(map(int, input().split())) # +, -, *, // str_operator = [] for idx, i in enumerate(operator): if idx == 0: for j in range(i): str_operator.append('+') continue elif idx == 1: for j in range(i): str_operator.append('-') continue eli..

[n10819] 차이를 최대로 in python

n = int(input()) array = list(map(int, input().split())) visited = [0 for i in range(n)] answer = 0 new_array = [] def dfs(cnt, new_array): global answer if cnt == n: answer = max(answer, sum(abs(new_array[i]-new_array[i+1]) for i in range(n-1))) return for i in range(n): if visited[i]: #방문한 곳이라면? continue visited[i] = 1 new_array.append(array[i]) dfs(cnt + 1, new_array) visited[i] = 0 new_array..