Algorithm/Programmers
[프로그래머스] 뉴스 클러스터링/ 파이썬/ Python/ 2018 KAKAO BLIND RECRUITMENT/ 카카오 코테
💡solutions ) 💬 로직은 크게 2가지. 문자열에서 영문자 조합으로 된 유효한 글자쌍 찾기 / Counter로 합집합, 교집합 연산 후 길이 구하기 💬 대소문자 차이는 무시하므로 모두 대문자로 바꿨다 -> upper()메소드 사용 💬 각 문자열을 2개씩 끊어 다중집합으로 만드는데 영문자로 된 조합만 lst에 append해준다 -> isalpha()로 문자인지 확인 💬 모두 공집합인 경우에는 65536 바로 리턴 💬 collections 모듈의 Counter 클래스 사용. 처음에 set을 떠올렸는데 set의 경우 중복을 제거하기 때문에 제대로된 결과값을 얻기 어려워서 Counter을 사용했음. 💬 Counter을 &합집합 연산(inter), |교집합 연산(union)을 하고 길이를 구해 결과값 리턴..
[프로그래머스] 올바른 괄호 /파이썬 /Python
💡solutions ) 💬 반복문에서 나온 괄호가 "( " 괄호면 stack에 넣고, ")"가 나오면 stack의 맨 마지막 요소가 "("괄호로 맞는 지 확인하고 짝이 맞는 경우 맨 마지막 요소인 "("를 pop으로 제거한다. 즉, "("와")"가 만날 때만 stack에서 "("제거 💬 단, stack이 비어있을 때 나온 요소가 ")"이면 올바르지 않은 괄호이니 바로 False를 리턴한다. 💬 그 아래 참고로 가져온 코드는 괄호 종류가 두개이니 "("인 경우 +1, ")"인 경우 -1을 하여 최종 결과값이 0이 되는지 확인하는 로직이다. 🎫code ) ✔ 나의 풀이 def solution(s): stack = [] for i in range(len(s)): if not stack and s[i] == '..
[프로그래머스] 숫자의 표현 /파이썬 /Python
💡solutions ) 💬 n이 주어진 경우 n//2까지만 확인하면 된다. 문제에서 주어진 예시처럼 n이 15인 경우에 7까지만 연속된 숫자를 확인할 수 있고, 8인 경우는 그 다음 숫자를 더하면 15를 초과하므로 불포함이기 때문에 확인할 필요가 없다. 💬 숫자 n 하나도 경우의 수에 포함되므로 answer은 1부터 시작한다. 🎫code ) def solution(n): answer = 1 for i in range(1, n//2+1): tmp = 0 for j in range(i, n//2+2): tmp += j if tmp > n: break if tmp == n: answer += 1 break return answer 📌 description ) 문제출처 : programmers.co.kr/lea..
[프로그래머스] 후보키 /파이썬 /Python /2019 KAKAO BLIND RECRUITMENT /카카오 코테
💡solutions ) 💬 해당 문제는 데이터베이스의 후보키 개념을 알고 있으면 더 쉽게 이해할 수 있다 💬 로직은 크게 3단계 => 전체 조합 구하기 / 유일성 만족하는 경우만 거르기 / 최소성 만족하지 않는 경우 제거 💬 모든 경우의 수는 itertools 라이브러리 사용, 컬럼 인덱스를 요소로 combinations 조합 구하기 💬 각 인덱스에 해당하는 모든 속성들을 튜플 형태로 뽑고 그 개수가, 전체 행의 개수와 동일한지 확인 후 만족하는 경우만 unique 리스트에 담기 (유일성을 만족하는 경우) 💬 최소성의 경우 unique 리스트에서 하나씩 뽑고, 그 다음 요소들과의 교집합을 구해서 길이를 비교한다. 길이가 같은 경우만 요소들이 겹치는 경우이니 최소성을 만족하지 않아 discard로 제거. ..
[프로그래머스] 큰 수 만들기/ 파이썬/ Python / Stack
💡solutions ) 💬 이미 k개 만큼의 숫자 삭제를 완료한 경우에는 s 스택에 모두 넣기 💬 첫번째 숫자는 먼저 넣고 시작하며, while문 안에서 s 스택에 넣어야 하는 숫자(i)와 기존 s 스택에 담겨있는 숫자들의 크기를 비교하기 -> i가 기존 숫자보다 크면 기존 숫자 제거(pop하고 cnt +1) 💬 이미 k개를 모두 삭제하거나 i가 기존 숫자보다 작거나 같은 경우에는 break를 걸어 while문 중단 💬 숫자를 다 넣었는데 아직 제거해야 할 k가 남아 있는 경우, 맨 뒤에서부터 pop으로 남은 k개수 만큼 숫자 삭제 💬 참고로 나의 경우 첫 시도에선 마지막 12번 케이스 통과하지 못 했고, 아래 두 가지 테스트케이스를 넣어 코드를 수정한 후 통과할 수 있었다. # 12번 대비 테스트케이스..
[프로그래머스] 조이스틱 /파이썬 /Python /탐욕법(Greedy)
💡solutions ) 💬 로직 크게 두 가지 => 상하로 최소 거리 구해서 알파벳 바꾸기 / 좌우로 최소 거리 구해서 방향 정한 후 이동하기 💬 change 배열에는 각 알파벳마다 상하 조정 중 min값으로 최소 횟수를 담아두기 💬 idx 0번 부터 시작해서 좌우 이동 횟수를 answer에 더해주기 💬 좌우 방향 전환 시에는 바꿔야하는 알파벳이 나오기까지의 좌우 거리를 구하고, 그 중 최소값이 되는 방향으로 전환한다. 💬 모든 알파벳이 조정된 경우(change의 sum이 0일 때) -> 결과값 반환 🎫code ) def solution(name): # 상하 조정으로 알파벳 바꾸기 change = [min(ord(i) - ord('A'), ord('Z') - ord(i) + 1) for i in name..
[프로그래머스] 다트게임 /파이썬 /Python/ 2018 KAKAO BLIND RECRUITMENT/ 카카오 코딩 테스트
💡solutions ) 💬 로직 크게 두 가지로 구현했다. 문자열 세트를 기회별로 나누는 로직과 점수 계산하는 로직. 💬 먼저 입력 받은 문자열 세트를 기회별로 나눠서 딕셔너리 res에 넣어주기 💬 이때 점수가 10인 경우 주의 ->'_'로 치환해서 넣어주기 💬 딕셔너리에서 키, 밸류값을 뽑아와서 각각 점수, 보너스, 옵션 별로 점수를 계산해준 후, 다시 딕셔너리 원래 자리에 넣어주기 💬 합산해서 결과값 리턴 🎫code ) def solution(dartResult): answer = 0 res = {} idx = -1 check = 1 # 기회별 점수 -> 딕셔너리에 구분해 넣기 for i in dartResult: if i.isdigit(): if check == 1: idx += 1 res[idx]..
[프로그래머스] 프렌즈4블록 /파이썬 /Python /2018 KAKAO BLIND RECRUITMENT
💡solutions ) 💬 2X2 블록이 사라지고 나머지 위에 있는 블록이 떨어져 빈 공간을 채우는 로직을 보다 간단히 구현하기 위해 행열을 뒤집었다 => zip과 list로의 매핑을 통해 전치행렬 만들기 💬 four_blocks 함수에서 2X2 블록이 되는 경우의 위치를 visit_set에 담아두는데, 같은 블록이 여러 2X2에 포함될 수 있으므로 중복을 피하기 위해 set 자료형 활용 💬 모든 2x2의 경우를 찾은 후 반복문으로 1로 표시해주고 -> 행렬의 한 행마다 돌아가며 1의 개수만큼 '_'로 치환하고 맨 앞에 붙이는 것처럼 구현한다. 즉, 나머지 블록들이 서로 붙어 있게 재배치하는 것. 🎫code ) def four_blocks(m, n, board): visit_set = set() for ..
[프로그래머스] 키패드 누르기 /파이썬 /Python /2020 카카오 인턴십
💡solutions ) ✅ 세 가지 경우로 나눈다 - #left 왼손가락을 움직이는 경우(1,4,7) - #right 오른손가락을 움직이는 경우(3,6,9) - #middle 가운데 번호인 경우에는 -> 각 두 손가락의 위치와 움직여야 하는 숫자 간의 거리를 구해서 값 비교하기(distance) ✅ 거리는 좌표를 활용해 맨하탄 거리로 구한다 -> distance 함수 구현 ✅ d_r(오른 손가락과의 거리)가 d_l(왼 손가락과의 거리)보다 크면 L 붙이기 (왼 손가락 이동), 그 반대도 성립 ✅ 만약 거리 차이가 같으면 왼손잡이인지 오른손잡이인지 판별 후 answer에 이동한 손가락 더하기 ✅ 테스트 케이스 8번 15번에서 자꾸 오류가 나서 덕봇기와 함께 살펴보니 처음 초기값 tmp_r과 tmp_l를 0..
[프로그래머스] 튜플/ 파이썬/ Python/ 2019 카카오 개발자 겨울 인턴십
💡solutions ) ✅ ',{'를 기준으로 집합별로 끊어준다(split) ✅ 문자 길이를 기준으로 정렬한다(sort) ✅ 집합에 들어 있는 원소들을 꺼내어 숫자인 경우에는 answer에 있는 지 확인 후 없으면 담아준다. ✅ 다른 사람 풀이를 찾아보다 보니, 정규 표현식을 활용한 경우가 있었다. 파이썬의 re(regular expression) 모듈을 사용, findall() 메서드를 통해 문자열을 검색할 수 있다. 이 문제에서는 i를 바로 re.findall("\d+", i)로 표현해 숫자값들만 찾아서 리스트에 담아줄 수 있다. 🎫code ) def solution(s): answer = [] a = s.split(',{') a.sort(key = len) tmp = '' for i in a: fo..
[프로그래머스] 문자열 압축/ 파이썬/ Python/ 2020 KAKAO BLIND RECRUITMENT/ 카카오 블라인드 채용
💡solutions ) ✅ slicing으로 문자열을 몇개씩 끊을 것인지 정해서 반복문으로 처리, 이때 범위는 len(s)//2+2인데, 전체 문자열의 범위 절반까지가 최대 압축 길이기 때문에 문자열 절반까지로 끊는다. 이때 문자열이 1인 경우를 고려하지 않아서 처음에는 len(s)//2 +1로 했다가 테스트 케이스 하나가 오류 났었다. 문자열 1인 경우를 포함하기 위해 len(s)//2+2로 수정했다. ✅ tmp는 기준 단위로 끊은 문자열을 비교를 위해 담아둔다. ✅ 그 다음 문자열부터 다시 반복문을 돌며 같은 단위의 문자열이 있는지 확인한 후 같으면 cnt+1, 다르면 tmp가 몇번 반복해서 나왔는지 cnt를 앞에 붙여서 res에 담아준다.(이때 cnt가 1이면 res에 tmp만 담기) ✅ 결국 답이..
[프로그래머스] 프린터 /파이썬 / Python / deque
💡solutions ) ✅ 스택에서 pop(0) 하는 것보다(시간복잡도 O(N)) deque 자료형으로 popleft()하는 게 훨씬 효율적이다(시간복잡도O(1)) ✅ 밸류 값과 인덱스 값을 함께 사용하므로 enumerate 함수 사용 ✅ item 보다 max 이 크다면 다시 배열에 담아주고, 그렇지 않은 경우 answer+1 ✅ item의 인덱스가 location이랑 동일하다면 반복문 종료 -> answer 반환 ✅ 다른 사람의 풀이를 확인해 보니 파이썬 내장함수 중 any를 사용해서 while문 안의 조건문을 짠 코드도 있었다. if any( item[0] item[0]: array.append(item) else: answer += 1 if item[1] == location: break retur..