본문 바로가기

⏳ 알고리즘

(103)
런너(runner) 기법이란?? 런너(Runner) 기법 런너 기법이란 연결 리스트 순회 시 2개의 포인터를 동시에 사용하는 기법이다. 한 포인터가 다른 포인터보다 앞서게 하여 병합 지점이나 중간 위치, 길이 등을 판별할 때 유용하게 사용할 수 있다. fast runner와 slow runner 간의 step을 2배 차이를 두는 식으로 (ex. fast, slow = 2,1) 지정한 후 fast runner가 리스트의 끝지점에 도착하면 slow는 정확히 리스트의 중간 지점에 도달하게 된다. 런너 기법을 사용하는 문제 leetcode.com/problems/palindrome-linked-list/submissions/ Palindrome Linked List - LeetCode Level up your coding skills and ..
리트코드 - 349. Intersection of Two Arrays 문제 leetcode.com/problems/intersection-of-two-arrays/ Intersection of Two Arrays - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 코드 - set.intersection 이용 class Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: nums1 = sorted(list(set(nums1))) nums2..
프로그래머스 - LV3. 가장 긴 팰린드롬 팰린드롬(Panlindrome) 팰린드롬이란 "kayak", "eye"과 같이 뒤집어도 같은 문자열을 말한다. 문제 programmers.co.kr/learn/courses/30/lessons/12904 코딩테스트 연습 - 가장 긴 팰린드롬 앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다. 문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요. 예를들 programmers.co.kr 코드 1) 경우를 나누어 비교 def solution(s): maxLen = 1 #경우를 나누어 비교 for i in range(len(s)): if i-maxLen >= 1 and s[i-maxLen-1 :..
프로그래머스 - LV2. 튜플(2019 카카오 개발자 겨울 인턴십) 문제 programmers.co.kr/learn/courses/30/lessons/64065 코딩테스트 연습 - 튜플 "{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1] programmers.co.kr 코드 1) 두개의 배열(arr1, arr2)을 비교하여 arr2에 없는 arr1의 원소를 반환 def solution(s): sets = s[2:-2].split('},{') for i in range(len(sets)): sets[i] = list(map(int,sets[i].split(','))) sets[i].so..
프로그래머스 - LV3. 2*n 타일링 문제 programmers.co.kr/learn/courses/30/lessons/12900 코딩테스트 연습 - 2 x n 타일링 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 programmers.co.kr 코드 1) math모듈의 factorial 이용 from math import factorial def solution(n): answer = 0 tile_1 = n tile_2 = 0 while tile_1 >= 0: if tile_1 == 0 or tile_2 == 0: answer += 1 else: answer += factorial(tile_1 + ..
프로그래머스 - LV2. 조이스틱 문제 programmers.co.kr/learn/courses/30/lessons/42860# 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr 코드 def solution(name): arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" origin = ["A"]*len(name) count = [0]*len(name) cnt = 0 if len(name) == 1: if arr.index(name[0]) >= 13: return 26-arr.index(name) else: ret..
프로그래머스 - LV2. 전화번호 목록 문제 programmers.co.kr/learn/courses/30/lessons/42577 코딩테스트 연습 - 전화번호 목록 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조 programmers.co.kr 코드 1) startswitch()이용 오랜만에 다시 풀어봤는데 효율성 테스트에서 실패가 떴다. def solution(phone_book): phone_book.sort(key=lambda x:len(x)) for i in range(len(phone_book)): for j in range(i+1, len(phone_book)): if phone_book[j].s..
알고리즘 - LV3.줄 서는 방법 문제 programmers.co.kr/learn/courses/30/lessons/12936 코딩테스트 연습 - 줄 서는 방법 n명의 사람이 일렬로 줄을 서고 있습니다. n명의 사람들에게는 각각 1번부터 n번까지 번호가 매겨져 있습니다. n명이 사람을 줄을 서는 방법은 여러가지 방법이 있습니다. 예를 들어서 3명의 사람 programmers.co.kr 코드 1) itertools모듈의 permutations이용 => 경우의 수를 불필요하게 많이 계산하게 됨 import itertools def solution(n, k): return list(itertools.permutations(range(1,n+1), n))[k-1] 2) math모듈의 factorial이용 import math def soluti..
알고리즘 문제 - LV3. 숫자의 표현 문제 programmers.co.kr/learn/courses/30/lessons/12924 코딩테스트 연습 - 숫자의 표현 Finn은 요즘 수학공부에 빠져 있습니다. 수학 공부를 하던 Finn은 자연수 n을 연속한 자연수들로 표현 하는 방법이 여러개라는 사실을 알게 되었습니다. 예를들어 15는 다음과 같이 4가지로 표현 할 programmers.co.kr 코드 1) 배열 슬라이싱 이용 import math def solution(n): result = 1 #result에 n = n인 경우 미리 포함 numbers = [] mid = math.ceil(n/2) for num in range(1,n+1): numbers.append(num) for i in range(mid): for j in range(..
알고리즘 문제 - LV3. 최고의 집합 문제 programmers.co.kr/learn/courses/30/lessons/12938 코딩테스트 연습 - 최고의 집합 자연수 n 개로 이루어진 중복 집합(multi set, 편의상 이후에는 "집합"으로 통칭) 중에 다음 두 조건을 만족하는 집합을 최고의 집합이라고 합니다. 각 원소의 합이 S가 되는 수의 집합 위 조건을 만 programmers.co.kr 코드 1) 나머지 개수만큼 +1 def solution(n, s): if n > s: return [-1] div = s//n rem = s%n answer = [div]*(n) print("answer =",answer) print("나머지 =",rem) for k in range(0, rem): answer[k] += 1 answer.sort..