Programmers 60

[프로그래머스 / 파이썬 풀이] 괄호 회전하기

def solution(s): s = list(s) global answer answer = 0 def check(brackets): dic = { '}' : '{', ']' : '[', ')' : '(' } global answer lst = [] for i in brackets: if len(lst) == 0: lst.append(i) else: if i in dic.keys(): if dic[i] == lst[-1]: lst.pop() else: lst.append(i) if not lst: answer += 1 return for i in range(len(s)): a = s.pop(0) s.append(a) check(s) return answer 괄호 배열을 한칸씩 회전하면서 모든 수를 비교한..

Programmers 2023.02.17

[프로그래머스 / 파이썬 풀이] 예상 대진표

시간초과 코드 def solution(n,a,b): answer = 0 arr = [i for i in range(1, n+1)] while True: sub_lst = [] for i in range(0, n, 2): if arr[i] == a and arr[i+1] == b: answer += 1 return answer if arr[i] in [a, b]: sub_lst.append(arr[i]) elif arr[i+1] in [a, b]: sub_lst.append(arr[i+1]) else: sub_lst.append(arr[i]) arr = sub_lst answer += 1 n //= 2 return answer 문제에 맞춰 로직을 그대로 구현 한 결과로 시간초과가 나게됨 (n의 범위가 배우..

Programmers 2023.02.16

[프로그래머스 / 파이썬 풀이] 영어 끝말잇기

def solution(n, words): dic = {words[0] : 1} for i in range(1, len(words)): if words[i][0] != words[i-1][-1]: return [i % n + 1, i // n + 1] else: if words[i] not in dic: dic[words[i]] = 1 else: dic[words[i]] += 1 return [i % n + 1, i // n + 1] return [0, 0] 딕셔너리를 생성 후 끝말잇기의 첫 값을 키밸류로 넣는다. for문을 1번 인덱스부터 시작해 각 단어의 끝과 첫 글자를 비교한다. (다르면 return) 이후 딕셔너리에 없으면 추가, 있으면 +1을 해주면서 만약 +1이 된다면 중복이므로 return ..

Programmers 2023.02.15

[프로그래머스 / 파이썬 풀이] 멀리 뛰기

def solution(n): memo = [0] * (n+2) memo[1] = 1 memo[2] = 2 for i in range(3, n+1): memo[i] = (memo[i-1] + memo[i-2]) % 1234567 return memo[n] dp문제 중 하나 n개의 칸을 뛰려면 n-1개 칸을 뛸 때의 경우의 수 + n-2개 칸을 뛸 때의 경우의 수가 돼야 한다. (5개의 칸 = 4개의 칸 + 3개의 칸 .... 3개의 칸 = 2개의 칸 + 1개의 칸) 과 같은 식으로 결론적으론 피보나치 수열과 같은 방식의 풀이로 풀이하게 된다. memo 배열을 초기화 하는 방법 중 n+1로 둔 이유는 만약 n이 1이 들어오게 된다면 3번째 인덱스인 memo[2] 를 생성할 수 없기 때문에 그 부분을 고려해..

Programmers 2023.02.14

[프로그래머스 / 파이썬 풀이] 짝지어 제거하기

def solution(s): answer = -1 stack = [] for i in range(len(s)): if len(stack) == 0: stack.append(s[i]) else: if stack[-1] == s[i]: stack.pop() else: stack.append(s[i]) if stack: answer = 0 else: answer = 1 return answer stack을 활용 한 풀이. stack과 현재 순회하는 값을 비교 한 후 stack의 마지막 원소와 순회하는 원소가 같으면 stack을 pop 해준다. 같지 않다면 stack에 순회하는 원소를 append 순회가 끝났을 때, stack이 비어있다면 1, 비어있지 않다면 0

Programmers 2023.02.13

[프로그래머스 / 파이썬 풀이] 다음 큰 숫자

def solution(n): def changeBinary(n): arr = [] x = n while x >= 1: arr.append(x%2) x //= 2 return arr for i in range(n+1, 1000001): if changeBinary(i).count(1) == changeBinary(n).count(1): return i answer = 0 return answer 10진법을 2진법으로 변환하는 함수를 작성하고 입력받은 값보다 큰 수 부터 순회하는 for문을 통해 해당 숫자를 2진법으로 변환 후 1의 개수를 비교한다.

Programmers 2023.02.10

[프로그래머스 / 파이썬 풀이] 피보나치 수

def solution(n): answer = 0 stack = [0, 1] for i in range(100001): stack.append(stack[-1] + stack[-2]) if i == n: answer = stack[n] % 1234567 break return answer 스택에 미리 정의 된 0, 1 번째 수를 작성하고 피보나치 수는 맨마지막 값과 그 마지막 값의 전 값을 더하기 때문에 해당하는 값을 스택에 추가해준다. 그리고 n의 값과 더해준 값의 인덱스가 같다면 break를 해줘서 효율성을 높여준다. 나는 범위를 문제에 맞게 100000 까지 순회하고 해당 인덱스에서 break하는 식으로 작성했지만, 범위를 range(n+1)로 설정한다면 좀 더 좋은 코드를 작성 할 수 있었을 것 ..

Programmers 2023.02.10
LIST