CS/Algorithm & Data Structure
-
[Programmers][Python] 주사위 게임 3CS/Algorithm & Data Structure 2023. 9. 9. 20:33
주사위 숫자가 몇 번 '중복'등장하는 지에 따라 return값이 달라진다. python에서 중복이라고 하면 set함수와 dictionary가 떠오른다. 1. Set 처음에는 set함수를 떠올렸다. set을 통해 중복을 없앤 집합의 요소가 몇 개인지 판단하여, 집합을 배열로 변환해 값을 계산 후 return하려고 했다. 하지만 그렇게 할 경우 중복이 3개여도 집합에 2개가 남고, 예) [4, 1, 4, 4] => {4, 1} 중복이 2개여도 집합에 2개가 남아 예) [4, 4, 1, 1] => {4, 1} 구분이 모호해지는 문제가 있으므로, 다른 어떤 방식으로 또 처리해주긴 번거롭지 않을까 했다. 2. Dictionary 그래서 남은 것의 개수를 보는 것이 아니라, 직접 중복 횟수를 세어주기로 했다. 그를..
-
[BOJ] 1302 베스트셀러CS/Algorithm & Data Structure 2023. 7. 23. 18:08
책 이름별로 몇 권을 팔았는지 표시해야한다. 따라서 dictionary를 사용해서 key: 책 이름, value: 판매권수 기록하면 좋을 것 같았다. 1. 변수에 기록 d = dict() max = 0 maxBook = "" for _ in range(int(input())): book=input() if book in d: d[book] +=1 else: d[book]=1 if d[book]>max: max=d[book] maxBook=book elif d[book]==max: if bookmax: max=v maxBook=k elif v==max: if maxBook>k: maxBook=k print(maxBook)
-
[Programmers][Python] 옹알이(1)CS/Algorithm & Data Structure 2023. 5. 10. 23:00
- 처음에 생각한 풀이 1. 발음 가능한 단어와 완전 일치한 입력단어가 있나? --> 바로 answer에 1을 추가하고 continue. 2. 일치하지는 않는다면 발음 가능한지(가능한 것들로 이뤄졌는지) 체크 --> 발음 가능한 단어를 하나씩 꺼내어 입력단어에 포함되었는지 확인, 있다면 1회 제거(문자열에서 최대 1번만 등장한다는 조건 때문) replace사용 2-2. 한 입력단어에 대해 모든 '발음가능단어'를 포함 확인&제거 했을 때, 문자열이 비어서 ' ' 이면 발음 가능한 단어이므로 answer에 1을 추가 able = {"aya", "ye", "woo", "ma"} def solution(babbling): answer = 0 for word in babbling: if word in able: ..
-
[BOJ][Python]2748 피보나치 수2CS/Algorithm & Data Structure 2023. 5. 10. 13:01
재귀로 풀 수도 있겠지만 시간초과가 날 가능성으로 인해 DP 활용 1. Bottom-Up n = int(input()) dp = [0]*(n+1) dp[1]=1 for i in range(2, n+1): dp[i] = dp[i-1]+dp[i-2] print(dp[n]) 2. Top-Down n = int(input()) DP = [0]*(n+1) DP[0] = 0 DP[1] = 1 def fib(num): if num==0 or num==1: return DP[num] elif DP[num]==0: DP[num]=fib(num-1)+fib(num-2) return DP[num] print(fib(n))
-
[BOJ][Python] 백준 1475 방 번호CS/Algorithm & Data Structure 2023. 3. 9. 11:41
단순히 카드세트 배열하나 선언, 그 안에 값이 있으면remove하고 다음 번호 체크 없으면 한 세트를 pack에 추가해주고 해당 번호 하나를 뺐다. 특이한 점이라면 값이 6일때는 9가 있나체크(&반대의 경우 체크)를 했단 것이다. N = list(input()) for i in range(len(N)): N[i]=int(N[i]) pack = [] def addPack(): pack.extend([0,1,2,3,4,5,6,7,8,9]) cnt = 0 for i in N: if i in pack: pack.remove(i) elif i==6 and 9 in pack: pack.remove(9) elif i==9 and 6 in pack: pack.remove(6) else: cnt+=1 addPack() ..
-
유클리드 호제법(최대공약수 재귀로 구하기)CS/Algorithm & Data Structure 2023. 2. 21. 02:52
두 자연수의 최대공약수를 구하는 대표적 알고리즘. 특징: 자연수 A,B에서 A%B=R일 때 A,B의 최대공약수 == B,R의 최대공약수 예를 들어 A: 192와 B: 162의 최대공약수를 구할 때(GCD(192,162)) Level A B 1 192 162 2 162 30 3 30 12 4 12 6 즉, 192와162의 최대공약수는 12와 6의 최대공약수(즉, 6)과 동일하다. 따라서 재귀함수를 통해 R이 0이 아닌 동안 두 수를 나누도록 구현할 수 있다. def gcd(a, b): if a%b==0: return b return gcd(b, a%b) print(gcd(192,162))
-
Python의 queueCS/Algorithm & Data Structure 2023. 2. 21. 02:30
파이썬에서 큐를 구현할 때 1. 리스트로 구현하기 2. deque라이브러리 이용 리스트로 구현하는건 시간복잡도가 더 높으니 deque을 이용하는 것이 좋다. 통상적으로 삽입은 append(), 삭제는 popleft()를 사용한다. 오른쪽으로 들어온 요소가 왼쪽으로 나간다고 생각하면 편할 것 같다. from collections import duque queue = deque() queue.append(5) queue.append(3) queue.popleft() => 3
-
[구현] 왕실의 나이트CS/Algorithm & Data Structure 2023. 2. 21. 01:58
나는 아래와 같이 풀었다. 1,1칸부터 8,8칸까지 돌며 조건에 맞는 칸만 체크를 했다. input_data = input() r = int(input_data[1]) c = ord(input_data[0])-ord('a')+1) cnt=0 for i in range(1,9): for j in range(1,9): if abs(r-i)==2 and abs(c-j)==1: cnt+=1 if abs(r-i)==1 and abs(c-j)==2: cnt+=1 print(cnt) 처음에 이동할 수 있는 방향이 몇 개 없으니 그것만 체크하면 되겠다 라고 생각했다 근데 직전에 푼 브루트포스 문제의 여파인지, 8 x 8 좌표는 작으니 그냥 다 체크하자고 생각해버렸던 거 같다. 정답으로 보여주신 코드인데, 처음 생각대로..