프로그래머스 13

프로그래머스 타겟 넘버 (Javascript) 풀이, "트리다 트리!"

트리다 트리!!! 문제 링크 문제 설명 n개의 음의 아닌 정수를 적절히 더하거나 빼서 타깃 넘버로 만드는 경우를 수를 구하는 문제다. 해결 과정 결국 n 개의 모든 수를 각각 더하거나 뺄 수 있다. 그리고 그 경우의 수를 알고, 그 값들이 타깃 넘버인지 비교해야 한다. 처음에는 어떻게 이 모든 경우를 반복문으로 구한단 말인가? 절망하다가 뭔가 규칙이 느껴지는 듯 했다. 더하거나, 빼거나, 더하거나 빼거나 ... 그리고 그 값은 누적된다. 트리다 트리!! 마치 위와 같은 형태였다. 오오, 이것은 트리였다! 트리의 모든 요소를 다뤄야 하나? 그리고 numbers로 들어온 요소의 수를 더하든 빼든 그 결과만 모아서 확인해야 하는데, 그것은 트리에서 같은 깊이, Level을 들여다보면 됐다. 그렇다면 트리를 어..

프로그래머스 | 로또의 최고순위와 최저순위 | 자바스크립트

문제 링크 해결 과정 문제 설명이 길고 복잡해 이거 1단계 맞나, 싶었지만 자세히 들여다보니 난이도가 쉬운 문제였다. 로또에서 불분명한 번호 0이 몇 개 나오는지 파악하면 최고순위와 최저순위를 자연스럽게 파악할 수 있다. 즉, 0은 어떤 번호던지 될 수 있으므로, 0이 모두 당첨번호이면 최고순위, 당첨번호가 아니면 최저순위가 된다. 따라서 이를 파악하기 위해 알아야 하는 기존의 번호들에서 몇 개가 당첨번호이고, 불분명한 번호가 몇 개인지 알아내는 것이다. 그러면 맞춘 개수에 따라 몇 등인지 알고 정답을 반환할 수 있다. 소스 코드 function solution(lottos, win_nums) { const rankPerMatches = [6, 6, 5, 4, 3, 2, 1]; const unknownN..

치욕스런 날코딩, 정규표현식 배워야겠다는 다짐

프로그래머스 | level 1 | Python | 신규 아이디 추천 문제 링크 def solution(new_id): new_id = new_id.lower() new_id = validateAllLetters(new_id) new_id = removeDubleDot(new_id) new_id = removeDotOfFrontAndRear(new_id) new_id = handleEmptyId(new_id) new_id = handleLongId(new_id) new_id = handleShortId(new_id) return new_id def validateAllLetters(id): new_id = "" for letter in id: if letter.isalpha() or letter.isdig..

레벨 1 문제에서 찾은 작은 교훈

프로그래머스 | level 1 | Python | 내적 나의 풀이 def solution(a, b): answer = 0 while a and b: answer += a.pop() * b.pop() return answer 처음 문제를 읽다가 내적에 링크가 걸려 있길래 들어갔더니 영어 위키 문서였다. 그래서 찬찬히 읽으려다가 수학 용어가 나오길래 바~로 한국어 문서를 찾았다.그랬더니 더욱 깊숙한 지식의 늪에 빠졌고 내 속에선 프로그래머스에 대한 배신감과 level 1 문제에서 조차 이렇게 고전하는 자신의 무력감 또한 느껴졌다. 하지만 알고보니 무척 쉬웠던 문제. 그냥 길이(심지어 길이가 같다고!)가 같은 리스트의 요소를 순서대로(심지어 순서대로!) 곱해서 합하면 끝이다. 허무하게 (몸 곳곳에 내적 개념이..

프로그래머스 | level 1 | python | 3진법 뒤집기

프로그래머스 | level 1 | python | 3진법 뒤집기 나의 풀이 def solution(n): answer = [] while n != 0: # 3진법 적용하여 거꾸로 표현 remainder = n % 3 # 나머지 if remainder == 0: answer.append(0) else: answer.append(remainder) n = n // 3 base = 1 # 밑 sum = 0 while answer: sum += answer.pop() * base base *= 3 return sum 3진법을 다루는 간단한 문제이다. 다시 알고리즘 문제를 풀며 실력을 끌어올리리라, 다짐하며 시작했다. 안 풀어 봤던 level 1 문제를 발견해 풀었다. 편리한 언어의 대명사 파이썬이라 3진법 만드..

프로그래머스 | 파이썬 | 삼각달팽이

코딩테스트 연습 - 삼각 달팽이 엄청 어려웠다. 결국 다른 사람 풀이를 참조했다. DFS/BFS 유형의 문제 같다. 풀이의 흐름 방향에 따른 좌표 값의 증감을 미리 정해둔다. 같은 방향으로 진행하면서 값을 넣어주고 범위를 벗어나려고 하면 방향을 바꾼다. 방향을 바꿀 때 방향을 그것을 3으로 나눈 나머지로 한다. 정해진 숫자만큼 칸을 다 채웠으면 리스트에 담는다. def solution(n): dx = [1, 0, -1] # 세로 dy = [0, 1, -1] # 가로 board = [[0] * (n) for _ in range(n)] count = 1 # 채울 숫자 x, y = 0, 0 direction = 0 end_count = (n * (n + 1)) / 2 while end_count >= coun..

프로그래머스 | 파이썬 | 문자열 압축

코딩테스트 연습 - 문자열 압축 나의 풀이 주어진 문자열 길이가 1이면 1을 반환한다. 문자열을 가장 길게 압축하는 길이는 문자열 절반 길이이다. 주어진 문자열을 1부터 문자열 절반 길이까지 압축한다. 주어진 문자열을 특정 간격으로 자른다. 자른 문자열을 비교하여 압축한다. 압축한 문자열의 길이를 담은 리스트(length_list)에 모든 압축한 문자열의 길이를 담는다. length_list의 최솟값을 구한다. def solution(string): length_list = [] string_length = len(string) if string_length == 1: return 1 for compress_length in range(1, string_length // 2 + 1): length_lis..

프로그래머스 | python | 괄호 변환 | 용기의 문제

코딩테스트 연습 - 괄호 변환 힌트 없이 풀었다. 와! 문제에 있는 설명대로 구현했더니 풀 수 있었다. 의외로 구현 난이도는 쉬운 편이었다. 이 문제를 풀려면 일단 용기가 필요했다. level 2만큼의 용기가 필요하다. 처음에 봤을 때 막막해서 풀지 않았다. 결국 계속 다른 문제를 풀고 돌아돌아 도착한 문제다. def solution(given_string): if given_string == "": return "" undividable_balanced, balanced = divide_string_to_2_balanced(given_string) if is_right_bracket(undividable_balanced): return undividable_balanced + solution(balan..

프로그래머스 | python | 스킬트리

코딩테스트 연습 - 스킬트리 소요 시간 1시간 30분, 풀다 못하겠어서 다른 사람 풀이 참조함. 무작위로 이뤄진 문자열(A)에 포함된 특정 문자열(B)의 문자들이 그 특정 문자열(B)의 순서를 지키는지 검사하는 문제였다. A = "awegd", B = "ag" → A의 a,g가 B의 순서를 지키고 있다. A = "gwaed", B = "ag" → A의 a,g가 B의 순서를 지키고 있지 않다. 나의 풀이 from collections import deque def solution(skill_order, skill_trees): answer = len(skill_trees) skill_order = skill_order for skill_tree in skill_trees: skill_order_queue ..

프로그래머스 | python | level 2 | 올바른 괄호

어려울 줄 알았는데 쉽게 풀었다. 아이디어는 간단했다. "()"를 계속 삭제해가면 된다. 그래서 처음엔 replace() 함수를 사용했다. 하지만 효율성 테스트를 통과하지 못했다. 그래서 매번 문자열을 탐색에 중간 값을 삭제하는 replace가 아니라, 차례대로 탐색해가며 삭제하는 게 무엇이 있을까 생각했다. 오, 그렇다. 스택을 떠올렸다. 스택을 사용했더니 효율성 테스트를 통과했다. 가장 끝의 두 값이 완전한 괄호("()")가 되면 pop하여 없애는 방식으로 구현했다. 인덱스가 없어 오류가 생기는 경우를 처리하기 위해 try except 구문을 사용했다. 첫 풀이, 효율성 테스트를 통과하지 못 했다. def solution(s): # 올바른 괄호 for _ in range(len(s)): s = s.r..