Algorithm 19

궁금함) 함수내 함수, 함수밖 함수 시간차이

뭔가 이상한거 발견 함 코드1 def solution(n): visited = [-1] * n count = 0 def is_Ok(row): for i in range(row): if visited[row] == visited[i] or abs(row - i) == abs(visited[row] - visited[i]): return False return True def dfs(row): nonlocal count if row == n: count += 1 return for col in range(n): visited[row] = col if is_Ok(row): dfs(row + 1) dfs(0) return count 코드2 answer = 0 def dfs(pan,num): global answ..

Algorithm 2022.05.31

프로그래머스) 보석쇼핑

https://programmers.co.kr/learn/courses/30/lessons/67258?language=python3 코딩테스트 연습 - 보석 쇼핑 ["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7] programmers.co.kr 프로그래머스 문제는 항상 길다. 링크로 대체한다. 처음에는 투포인터가 의미없다고 생각해서 풀다가 계속해서 시간 초과가 떴다. 결국, 답안을 보며 코드는 제외하고 이론만 습득한 후 구현을 했다. 투포인터를 이용해서 보석의 종류가 부족할 때는 end를 늘리고 보석의 종류가 다 모였다면 조건에 맞지 않을 때 까지 start를 늘려준다. from collections import defa..

Algorithm 2022.05.31

백준) 랜선 자르기

문제의 제한사항을 보면 logN으로 풀어야 할 것 같다. 이 경우는 이진 트리, 이분 탐색, 힙 세가지 경우가 자동으로 떠오른다. 이분 탐색 문제는 양식이 존재하는 느낌이다. dfs처럼 외워야 하는 부분이 있다. bisect를 사용하지 않은 로직으로 비슷하게 푼 문제가 많다. 이분 탐색을 사용하기 위해 배열을 정렬하고 return에 해당하는 부분을 target으로 잡은 뒤 이분탐색을 하면 된다. import sys info = list(map(int,sys.stdin.readline()[:-1].split())) inputs = [int(sys.stdin.readline()[:-1]) for _ in range(info[0])] inputs.sort() lo = 1 hi = inputs[-1] while..

Algorithm 2022.05.30

LeetCode) Largest Number

주어진 배열에 있는 숫자를 문자열로 붙여서 가장 큰 수를 만들어야 하는 문제다. 정렬방식 중 비교구문만 바꿔주면 된다. merge sort코드를 구글링해와서 비교구문만 바꿔주었다. 3 과 30 을 비교하는 방법: 330, 303 비교 class Solution(): def largestNumber(self, nums: List[int]) -> str: def merge_sort(arr): if len(arr) < 2: return arr mid = len(arr) // 2 low_arr = merge_sort(arr[:mid]) high_arr = merge_sort(arr[mid:]) merged_arr = [] l = h = 0 while l < len(low_arr) and h < len(high_..

Algorithm 2022.05.26

프로그래머스) 파일명 정렬

문제 : https://programmers.co.kr/learn/courses/30/lessons/17686?language=python3 코딩테스트 연습 - [3차] 파일명 정렬 파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램 programmers.co.kr 문제가 너무 길어 링크로.. header와 number부분을 확실하게 나누기만 하면 정렬을 해서 쉽게 풀 수 있는 문제다. def solution(files): answer = [] for i in range(len(files)): n_idx_s = -1 n_idx_e = -1 for j in range(len(..

Algorithm 2022.05.23

python) 정렬에 lambda함수 활용하기

알고리즘 정렬 문제는 정렬 자체를 구현해야 하는 경우가 있는데 파이썬 정렬 함수에 lambda를 활용해서 구현 없이 쉽게 정렬하는 법에 대해 다뤄 보려고 한다. 두 번째 원소를 기준으로 정렬하는 법 두 번째 원소를 기준으로 정렬 후 같은 값에 대해서만 첫 번째 원소를 기준으로 정렬하는 법 이 내용을 응용한 로직 https://ojy9612.tistory.com/34 python) 정렬에 lambda함수 활용하기 알고리즘 정렬 문제는 정렬 자체를 구현해야 하는 경우가 있는데 파이썬 정렬 함수에 lambda를 활용해서 구현 없이 쉽게 정렬하는 법에 대해 다뤄 보려고 한다. 두 번째 원소를 기준으로 정렬하는 ojy9612.tistory.com

Algorithm 2022.05.23

프로그래머스) 괄호 변환

문제 : https://programmers.co.kr/learn/courses/30/lessons/60058?language=python3 코딩테스트 연습 - 괄호 변환 카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 programmers.co.kr 문제가 너무 길어서 핵심만 적어 놓고 링크로 대체 한다. 이 문제는 무려 코딩 양식이 있다. 하지만 문제를 굉장히 이해하기 어려워서 풀기 쉽지 않다. 핵심 부분은 크게 2가지다. u에 올바른 문자열이 왔을 때와 균형 잡힌 문자열이 왔을 때 두 가지만 생각하면 된다. u = "( )", v = ") ) ( ( ( )" u가 올..

Algorithm 2022.05.22

python) deepcopy와 [:](슬라이싱) 차이

copy 모듈의 deepcopy는 리스트가 아닌 객체를 copy할때 유용한 것으로 알고있다. 하지만 오늘 들은 얘기는 조금 충격적이였다. 바로 2차원 배열에는 슬라이싱을 사용시 값이 제대로 복사가 되지 않는다는 점..! a = [ [1,2], [3,4] ] b = a[:] 배열 a는 위와 같이 슬라이싱을 하면 가장 밖에 있는 배열만 복사하고 안 쪽에 있는 배열들은 복사가 되지 않는다. 그 이유는 어렵지 않게 추측할 수 있다. 배열안에 배열을 넣기위해 주소값을 두 번 참조했기 때문이다. 그러므로 슬라이싱을 이용해 제대로 copy하려면 다음과 같이 사용해야한다. b = [ ] for i in range(len(a)): b.append(i[:]) 매우 귀찮은 과정이므로 그냥 deepcopy를 사용하도록 하자.

Algorithm 2022.05.21

LeetCode) subsets

Output과 같이 문자열을 출력하면 되는 문제다. 아주 간단한 집합의 모든 경우의 수를 출력하면 되는 문제이고 LeetCode의 특성상 Output의 원소들은 순서에 상관없이 그냥 return하면 된다. 백준이나 프로그래머스보다 친절한 사이트.. 영어만 아니면 이 곳에서만 알고리즘 연습을 했을 것 같다. dfs에 대한 강의와 문제를 접했던 후 라서 매우 쉽게 풀었다. dfs양식?을 잘 지킨 문제여서 관련 로직을 연습하는데에 큰 도움이 된다. class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: answer = [] def dfs(idx, path): answer.append(path) for i in range(idx, len(n..

Algorithm 2022.05.21

백준) 단지번호붙이기

섬의 개수라는 문제와 로직이 거의 동일한 문제다. '섬의 개수' 문제와 살짝 응용이 필요한 '단지 번호 붙이기' 문제 2개를 풀고 나면 DFS의 기본을 마스터했다고 말할 수 있을 것이다. dx와 dy에 상하좌우 정보를 미리 담아 활용하는 방식이 인상적이고 한 번에 생각하기 힘든 방식인 것 같다. 그리고 리스트는 주소 값만 전달한다는 점을 이용해서 dfs의 어느 곳에서든지 land라는 리스트에 접근할 수 있게 코드를 짰다. import sys inputs_len = int(sys.stdin.readline()[:-1]) inputs = [list(sys.stdin.readline()[:-1]) for _ in range(inputs_len)] dx = [0,0,1,-1] dy = [1,-1,0,0] m =..

Algorithm 2022.05.19