no image
[파이썬] Formatter와 Linter 알아보기
왜 필요? 똑같은 실행을 하는 코드여도 남이 짠 코드는 잘 안 읽힌다. 모두가 각자 나름의 규칙을 지켜서 최대한 깔끔하게 작성했겠지만 그 규칙이 남에게도 적용되기란 쉽지 않다. 이때, 각자가 최소한 정해진 규칙대로 코드를 작성하려고 노력하면 이해하는데 조금이나마 도움이 될 수 있다. 언어마다 각각의 코드 작성 규칙이 있는데 이를 스타일 가이드 또는 컨벤션이라고 한다. 파이썬에도 PEP8이라는 스타일 가이드가 있다. PEP 8 – Style Guide for Python Code | peps.python.org PEP 8 – Style Guide for Python Code Author Guido van Rossum , Barry Warsaw , Nick Coghlan Status Active Type P..
2022.05.23
no image
[SQLD] 데이터 모델링 파트 내용 정리
SQL 자격검정 실전문제집(노랭이)를 풀면서 정리한 내용입니다. 모델링 현실 세계에 대해서 표현 정보 시스템 구축을 위한 데이터 관점, 프로세스 관점의 업무 분석 데이터 베이스 구축을 위한 분석 및 설계하는 과정 현실 세계의 데이터(what)에 대해 약속된 표기법에 의해 표현 모델링의 특징 추상화 : 현실 세계를 일정한 형식에 맞추어 표현 단순화 : 복잡한 현실을 제한된 언어나 표기법을 통해 이해하기 쉽게 표현 명확화(정확화) : 애매모호함을 배제하고 누구나 이해가 가능하도록 정확하게 현상을 기술 모델링이 중요한 이유 업무 정보를 구성하는 기초가 되는 정보들을 일정한 표기법에 의해 표현하기 위해서 분석된 모델을 가지고 데이터베이스를 생성하여 개발 및 데이터 관리에 사용하기 위해서 데이터 모델링 자체로 업..
2022.05.22
no image
[파이썬] 소프티어 스마트 분류
Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트에서 문제를 확인해주세요. 나의 풀이 앞에 있는 로봇들이 자신의 왼쪽에 위치한 물류 부터 선택하게 하면 결국 최대 로봇 수를 구할 수 있다. import sys line_len, robot_range = map(int, input().split()) line_info = list(input()) count = 0 # 앞에서부터 조회 for idx, obj in enumerate(line_info): if obj == "P": for j in range(idx - robot_range, idx + robot_range + 1): if j line_len - 1: continue elif line_i..
2022.05.19
no image
[파이썬] 소프티어 지도 자동 구축
Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트에서 문제를 확인해주세요. 나의 풀이 반복이 진행될 수록 작은 지도를 반으로 가르는 직선들이 계속 추가 된다. 따라서 n번 째 시행 때 한 변에 놓인 점의 개수는 다음과 같다. $a_n = 2 + \sum_1^{n}2^{n-1}$ import sys n = int(input()) length = 2 for i in range(n): length += (2 ** i) print(length ** 2) 다른 사람 풀이 반으로 나누면서 중간에 겹치는 점이 발생하기 때문에 1을 빼준다. import sys N = int(sys.stdin.readline()) dp = [0] * 16 # N의 최댓값은 15이기 때문에 0단계..
2022.05.18
no image
[파이썬] 소프티어 택배 마스터 광우
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트에서 문제를 확인해주세요. 나의 풀이 레일의 개수가 10 이하기 때문에 가능한 모든 레일 조합을 순열로 구한 뒤 완전 탐색으로 풀었다. import sys from itertools import permutations n, m, k = map(int, input().split()) rail_info = list(map(int, input().split())) # N이 작기 때문에 모든 경우의 수 확인 cases = list(permutations(rail_info, n)) min_sum = 1e9 # 완전 탐색 for case in cases: # 각 탐색마다 k 횟수만큼 시행 case_sum = 0 id..
2022.05.18
no image
[파이썬] 소프티어 플레이페어 암호
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트에서 문제를 확인해주세요. 나의 풀이 문제의 조건에 맞춰 충실하게 구현하면 되는 문제다. 알파벳(A~Z)을 다 쓰기 귀찮아서 ascii_uppercase를 사용하여 남은 알파벳을 계산했다. 최종적으로 암호를 생성할 때 빠르게 접근하기 위해서 알파벳 별 idx 정보를 dict에 저장했다. import sys from string import ascii_uppercase from collections import deque msg = input() key = input() # 중복 제거 및 남은 알파벳 확인 key = deque(set(key)) alpha_left = deque(set(ascii_upperc..
2022.05.18
no image
[Python] Iterable(반복 가능한 객체)와 Iterator(이터레이터) 이해하기
Iterable(반복 가능한 객체)이란? Iterable의 의미와 효과 Iterable은 문자 그대로 반복 가능한 객체를 의미한다. 반복 가능함은 객체를 구성하는 요소가 여러 개이면서, 이 요소들을 한 번에 하나씩 꺼낼 수 있다는 것을 의미한다. 요소를 한 번에 하나씩 꺼낼 수 있다는 보장이 있다면, 굳이 객체의 모든 요소를 미리 메모리에 저장할 필요가 없다. 매번 실행마다 다음 요소에 해당하는 값만 새로 추가해주면 되기 때문이다. 이 경우 메모리를 절약할 수 있다는 장점이 생기게 되고, 이러한 특성을 Lazy Evaluation이라고 한다. 어떤 객체가 Iterable한가? 어떤 객체가 위와 같은 특성을 가지려면(반복 가능하려면) 해당 객체에 __iter__ 메소드가 있어야 한다. 따라서 hashatt..
2022.05.18
no image
[파이썬] 소프티어 장애물 인식 프로그램
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트에서 문제를 확인해주세요. 나의 풀이 전에 풀었던 백준 2667번 단지번호 붙이기 문제와 동일한 문제다. 풀고보니 이번에 풀 때는 불필요한 global 처리도 없애고 방문 처리도 graph 하나로 가지고 진행했다. 전 풀이는 아래 링크를 통해 확인할 수 있다. 다시 보니 부끄럽다. ㅋ import sys from collections import deque def bfs(queue): num = 0 while queue: x, y = queue.popleft() num += 1 for i in range(4): x_new = x + dx[i] y_new = y + dy[i] # 방문 아직 하지 않은 점이 ..
2022.05.17
no image
[파이썬] 소프티어 8단 변속기
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트에서 문제를 확인해주세요. 나의 풀이 단순한 문제라서 풀이에 대해 말할 것은 없다. 하지만 답이 이미 [1,2,3,4,5,6,7,8] 또는 [8,7,6,5,4,3,2,1]로 주어진 상황에서 굳이 원소 별로 확인할 필요가 없었던 거 같은데 그냥 관성적으로 접근했던 거 같다. 쉬운 문제여도 더 효율적으로 풀 수 있게 좀 더 생각하면서 풀자. import sys speed = list(map(int, input().split())) asc = 0 dsc = 0 for i in range(8): if speed[i] == i + 1: continue else: break else: asc = 1 for i in ..
2022.05.17
no image
[파이썬] 소프티어 바이러스
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트를 방문하여 문제를 확인해주세요. 나의 풀이 시간 초과가 발생하여 결국 풀이를 참고해서 풀었다. 처음엔 바이러스가 곱해지는 비율(거듭 제곱)을 빠르게 구하기 위해서 O(logN)의 시간 복잡도를 가지는 분할 정복을 사용했다. 하지만 N의 범위가 1,000,000이라서 분할 정복 여부는 시간 초과가 관계가 없었다. 결국 큰 수 끼리 곱해지는 과정에서 시간 초과가 발생하게 되는데 큰 수를 어떻게 처리해야할 지 몰랐다. 처음 분할 정복을 시도한 풀이는 다음과 같다. import sys def get_pow(a, b): if b == 0: return 1 # b가 짝수일 경우 elif b % 2 == 0: ret..
2022.05.17
no image
[파이썬] 소프티어 금고털이
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트를 방문하여 문제를 확인해주세요. 나의 풀이 정렬엔 O(N)인 Count 정렬 최대 무게를 얻기 위한 idx를 찾기 위해선 O(logN)인 이진 탐색 사용 idx를 찾는 경우엔 범위가 10,000이었기 때문에 단순 탐색으로도 시간 초과가 발생하지는 않았을 것이다. 귀금속의 종류(N)이 1,000,000이므로 $O(Nlog(N))$인 파이썬의 기본 정렬 대신 $O(N)$인 Counting 정렬을 사용했다. 이때, N(귀금속 종류의 수)가 P(귀금속 무게당 가치)보다 크기 때문에 P가 같은 경우가 발생할 수 있다. P가 같은 경우엔 동일 P를 가지는 귀금속 과 구분할 수 없기 때문에 무게를 추가해줬다. 이후 ..
2022.05.17
no image
[파이썬] 소프티어 GBC
문제 확인 Softeer 연습문제를 담을 Set을 선택해주세요. 취소 확인 softeer.ai 사이트를 방문하여 문제를 확인해주세요. 나의 풀이 구간 마다 조건을 나눠서 푸는 방법도 생각해봤지만 각 위치에서의 속도 정보를 저장해서 비교했다. 이 방법이 더 편하고 실수할 일도 없을 거 같아서 선택했다. import sys n, m = map(int, input().split()) # 제한 구간 정보 section_limit = [list(map(int, input().split())) for _ in range(n)] # 테스트 구간 정보 section_test = [list(map(int, input().split())) for _ in range(m)] # 제한 구간 정보 입력 speed_limit =..
2022.05.17