파이썬 70

백준 10816 카드넘버2 문제풀이

📌문제설명 📌문제접근방식 1차시도 3단계에 걸쳐 문제를 해결하려고 했다. 하지만 결과적으로 문제를 복잡하게 만들었다. 1. 입력받은 값을 정렬한다. 2. (입력받은 값, 개수)를 저장한 리스트를 생성한다. 3. 2번의 리스트에서 입력받은 값을 기준으로 이진탐색을 수행하고, 개수를 반환한다. 첫 시도는 이진 탐색을 사용했다. 이유는 숫자 카드 개수가 50만이었고, 숫자 카드의 범위가 -천만~+천만이었기 때문이다. 따라서 최악의 경우 50만 x 7log10을 계산하면 된다고 생각했다. 하지만 시간초과가 발생했다. 따라서 해쉬로 구현해야겠다는 생각이 들었다. 소스코드 import sys n = int(sys.stdin.readline().rstrip()) cards = list(map(int, sys.stdi..

알고리즘 2021.03.21

백준 10814 문제풀이

📌문제 설명 📌문제접근방식 enumerate함수를 이용해 회원별 번호를 매긴 뒤 나이순으로 정렬하면 된다고 생각했다. 만약 나이가 같다면 매겨둔 회원 번호로 정렬을 실시한다. 따라서 정렬의 기준를 2개로 설정했다. 📌문제풀이 1차 시도 실패한 이유는 다른 곳에서 발생했다. 입력받을 때 나이가 문자로 입력되었다. [(['21', 'Junkyu'], 1), (['21', 'Dohyun'], 2), (['20', 'Sunyoung'], 3)] 따라서 '21'과 '20'을 숫자로 바꿔주니 문제 없이 통과했다. 비교할 때는 반드시 비교하는 대상의 타입이 무엇인지 확인해야겠다. 소스코드 import sys n = int(sys.stdin.readline().rstrip()) input_list = [sys.stdi..

알고리즘 2021.03.20

딕셔너리와 zip함수 이해하기

📌딕셔너리 dict()함수 혹은 중괄호('{}')를 이용해 딕셔너리를 생성할 수 있다. 딕셔너리란 key와 value로 이루어진 자료형이다. dict1 = dict(a=1, b=2, c=3) dict2 = dict([('a',1),('b',2),('c',3)]) dict3 = {'a':1, 'b':2, 'c':3} print(dict1) print(dict2) print(dict3) # {'a':1, 'b':2, 'c':3} 📌zip() zip()함수를 이용해서도 딕셔너리를 만들 수 있다. dict1 = dict(zip(['a','b','c'], [1,2,3])) print(dict1) zip의 1,2번째 모두 길이가 같은 Iterable한 객체를 받는다. 그리고 각각의 요소를 차례로 짝지어주는 역할을 ..

enumerate함수(feat. 문자열비교)

📌enumerate란? enumerate함수는 enumerate 객체를 생성해주는 함수다. 그럼 enumerate 객체는 무엇일까? enumerate 객체는 순서 번호가 들어간 iterator 객체이다. 만약 반 학생들을 이름순으로 정렬한 뒤 각각 번호를 매긴다면 어떻게 해야할까? 이름순 정렬은 sort()나 sorted() 함수로 해결 가능할 것이다. 그런데 번호는 i=1부터 선언해서 각각 추가해 주어야 한다. 이를 간단하게 처리해주기 위한 함수가 enumerate 함수이다. student = ['Jihyeon', 'Andy', 'Chris', 'Songhye', 'Danny'] student.sort() enum_student = enumerate(student) for x in enum_studen..

패킹과 언패킹 이해하기

Packing & Unpacking 패킹은 묶는 것, 언패킹은 다시 푼다는 뜻이다. Iterable한 객체들을 대상으로 패킹과, 언패킹을 수행할 수 있다. 대표적으로 튜플이나 리스트를 대상으로 패킹과 언패킹을 사용할 수 있다. 튜플 패킹시에는 소괄호를 사용해도 되고 안해도 가능하다. 튜플을 언패킹할 때는 *를 사용하며 결과는 리스트로 묶인다. 📌Packing t = 1,2,3,4,5 print(t) 📌Unpacking nums = (1,2,3,4,5) n1, n2, *others = nums print(others) # [3,4,5] 📌파라미터에 대해 함수의 파라미터에 *를 붙일 경우 나머지 값들은 패킹해서 전달하겠다는 것을 의미한다. def sum(*nums): result = 0 for x in nu..

리스트 컴프리헨션으로 가독성 높이기

📌for문 대체하기 리스트를 정의할 때 for 루프를 대체하는 방식이다. 리스트에 1부터 100까지 for문으로 서넌 list1 = [] for i in range(1, 101): list1.append(i) 벌써 3줄이나 사용해야 한다. 리스트 컴프리헨션은 이를 대체할 수 있는 방법이다. list1 = [x for x in range(1,101)] 리스트 컴프리헨션을 더 쉽게 이해한 방법은 뒤의 for문을 먼저 작성하는 것이다. x를 1부터 100까지 loop를 돌고, 그 때마다 x를 리스트 요소에 추가한다. if문이 들어간 리스트 컴프리 헨션도 같은 방식이다. 📌if문 포함 만약 1부터 100까지 짝수만 리스트에 추가하고 싶을 땐 어떨까? list1 = [x for x in range(1,101) i..

백준 2164(카드분류2) 문제풀이

📌문제 설명 📌문제 접근 방식 첫 번째 시도 아무생각 없이 시도했다가 시간 초과가 떴다. 문제를 접근한 방식은 다음과 같았다. 1. 첫 번째 카드를 제거한다. 2. 두 번째 카드를 맨 뒤로 보낸다. 위 두 과정을 1장이 남을때까지 수행하면 되는 문제라고 생각했다. 따라서 리스트를 사용했고 맨 앞에 카드를 삭제하고 뒤로 보내도록 구현했다. 문제가 없을거라 생각했던 이유 두 가지이다. 1. 1중 for문을 사용했다. 2. 최대 가드 수가 50만장이다. 소스코드 # 2초 초과 - N 500000으로 대입 시 79초가 걸렸다. # 병목 지점은 어디지? import sys n = int(sys.stdin.readline().rstrip()) cards = [x for x in range(1,n+1)] def so..

알고리즘 2021.03.12

변경 불가능한 자료형 주의하기

변경 가능한 객체와 불가능한 객체 📌Immutable 변경 불가능한 객체는 무엇이 있을까? 파이썬에서는 대표적으로 문자열, 튜플이 있다. str1 = 'Rainy day' str1 = 'Sunny day' str1에 저장한 문자열을 바꾸었다. 하지만 여기서 문자열을 수정한 것은 아니다. 서로 다른 객체로 바꿔치기 한 것이다. 문자열 객체는 총 두 번 생성되었기 때문이다. 'Rainy day'와 'Sunny day' 즉, immutable한 객체는 문자열이 변경되지 않고 새롭게 생성된다. 튜플도 마찬가지이다. 튜플은 값을 변경하려고 시도하면 에러가 발생한다. 📌Mutable Mutable 객체는 변경 가능한 객체이다. 대표적으로 리스트, 딕셔너리가 있다. list1 = [1,2,3,4,5] list1[-1..

파이썬은 정말 인터프리터 언어일까?

📌파이썬 인터프리터 파이썬이 동작하는 방식은 인터프리터가 파이썬 코드를 바이트 코드로 변환한다. 바이트 코드가 PVM(Python Virtual Machine) 위에서 실행된다. 인터프리터가 파이썬 코드를 변환하고나면 .pyc 파일이 생성된다. 그런데 .pyc는 컴파일 된 파일이 아닌가? 라는 생각이 들었다. 📌자바와의 차이점 자바 코드의 실행 과정을 생각해 보았다. 자바 코드를 컴파일러(javac.exe)가 컴파일하여 .class 파일(byte code) 생성 컴파일된 .class 파일을 JVM에서 실행한다. 소스코드를 바이트 코드로 변환한 뒤 가상머신에서 실행한다는 점은 같다. 자바의 경우 컴파일러가 변환한 .class 파일이 생성된다. 이분법적으로 이것을 구분하는 것 자체가 문제라고 생각된다. 굳이..

백준 1920번[수찾기] 문제풀이

문제 설명 📌문제 접근 방법 처음에 간단히 생각했던 방법은 '빈 리스트에 B가 A에 있으면 1, 없으면 0을 저장하자'였습니다. 1. 빈 리스트 생성 2. B가 A에 있다면 1, 없으면 0 리턴 📌1차 오답 소스코드 import sys M = int(sys.stdin.readline().rstrip()) A = list(map(int, sys.stdin.readline().rstrip().split())) N = int(sys.stdin.readline().rstrip()) B = list(map(int, sys.stdin.readline().rstrip().split())) def solution(A, B): res = [] for x in B: if x in A: res.append(1) else: ..

알고리즘 2021.03.07