str.upper() 함수

str.upper() 함수는 문자열의 모든 문자를 대문자로 변환하는 함수이다. 이 함수를 호출하면 원본 문자열의 각 문자가 대문자로 변경된 새로운 문자열을 반환한다.

사용 예시:

text = "hello, world"
upper_text = text.upper()
print(upper_text)  # 출력: HELLO, WORLD
 

위 예시에서, text.upper()는 문자열 "hello, world"의 모든 문자를 대문자로 변환하여 "HELLO, WORLD"를 반환한다.

str.lower() 함수

str.lower() 함수는 문자열의 모든 문자를 소문자로 변환하는 함수이다. 이 함수를 호출하면 원본 문자열의 각 문자가 소문자로 변경된 새로운 문자열을 반환한다.

사용 예시:

text = "HELLO, WORLD"
lower_text = text.lower()
print(lower_text)  # 출력: hello, world

위 예시에서, text.lower()는 문자열 "HELLO, WORLD"의 모든 문자를 소문자로 변환하여 "hello, world"를 반환한다.

 

 

''.join(리스트이름) 
 
공백 없는 문자열로 합치기
 
' ' 안에 뭔가를 넣어서 한 칸씩 띄우거나 구분자를 추가할 수도 있다.
 
 
 
new = ["l","e","e","t","c","o","d","e"]

 

ex)

 

new 안의 원소들을 문자열로 출력해보자. 

print(''.join(new))



결과: "leetcode"

 

1. 기본적인 딕셔너리 만드는 방법

dict = {1:'You', 2: 'and', 3: 'I'}
print(dict)
print(dict[1])

'''
<결과>
{1: 'You', 2: 'and', 3: 'I'}
You
'''

 

 

딕셔너리에서 키 값은 고유하고, 변경할 수 없는 값이어야 한다. 
파이썬에서 튜플은 키 값이 될 수 있지만 리스트는 키가 될 수 없다.
파이썬 defaultdict모듈을 사용하면 key 값이 기본값으로 설정되기 때문에 어떤 키 값에 접근해도 에러가 발생하지 않는다. 

 

2. defaultdict 사용 방법

 

 

#리스트에서 성씨별로 이름을 분류하기

name_list = [('kang', 'julien'),('jung', 'junhyuck'), ('lee', 'jihoon'), ('lee', 'jihoon'), ('lee', 'jihoon'), ('jung', 'boseok'), ('shin', 'sekyeong')]
name_dict = defaultdict(list)

for key, value in name_list:
	name_dict[key].append(value)
	
print(name_dict)

'''
defaultdict(<class 'list'>, {'kang': ['julien'], 'lee': ['junhyuck', 'jihoon', 'jihoon', 'jihoon'], 'jung': ['boseok'], 'shin': ['sekyeong']})
'''

 

 

 

 

 

# 위의 리스트의 요소를 중복 제거해서 딕셔너리에 넣고 싶다면? 
--> list는 그대로 두고 defaultdict의 기본값을 set으로 하면 됨. 

name_list = [('kang', 'julien'),('jung', 'junhyuck'), ('lee', 'jihoon'), ('lee', 'jihoon'), ('lee', 'jihoon'), ('jung', 'boseok'), ('shin', 'sekyeong')]
name_dict = defaultdict(set)

for key, value in name_list:
	name_dict[key].add(value)
	
print(name_dict)

'''
defaultdict(<class 'set'>, {'kang': {'julien'}, 'lee': {'jihoon', 'junhyuck'}, 'jung': {'boseok'}, 'shin': {'sekyeong'}})
'''

 

 

 

 

 

 

#단어들을 글자수에 따라 분류하기

def group_words(words):
	grouper = defaultdict(list)
	for word in words:
		length = len(word)
		grouper[length].append(word)
	return grouper

print(group_words(["banana", "strawberry", "mango", "pineapple", "watermelon", "blueberry", "kiwi", "grapefruit"]))
'''
defaultdict(<class 'list'>, {6: ['banana'], 10: ['strawberry', 'watermelon', 'grapefruit'], 5: ['mango'], 9: ['pineapple', 'blueberry'], 4: ['kiwi']})
'''

파이썬에서 

문자를 아스키코드로 변환(ord)하고, 

아스키코드를 문자로 변환(chr)하는 방법

 

 

 

#알파벳이 주어졌을 때 숫자(아스키코드)로 바꾸기

ord("A")

=> 65



#숫자(아스키코드)가 주어졌을 때 알파벳으로 바꾸기

chr(65)

=> "A"

클래스는 객체 지향 프로그래밍(OOP)의 핵심 개념이다.

 

클래스를 사용하면 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶을 수 있다.

 

파이썬에서 __init__, self, super를 사용하여 클래스를 정의하는 방법을 알아보자. 

 

 

 

 

# 클래스와 객체의 정의

 

  • 클래스(Class): 객체를 만들기 위한 청사진 또는 설계도
  • 객체(Object): 클래스를 사용하여 생성된 실제 인스턴스

이다. 클래스==붕어빵 틀, 객체==붕어빵이라는 비유를 어디선가 들었던 것 같다. 

 

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# Person 클래스의 인스턴스 생성
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

 

 

 

# __init__ 메서드

 

__init__ 메서드는 클래스의 생성자로, 객체가 생성될 때 자동으로 호출된다. 객체를 초기화하는 데 사용되며, 클래스 내부에서 반드시 필요한 변수들(각각의 인스턴스가 가지는 속성)을 설정한다. 이때 첫번째 매개변수는 무조건 self인데 self는 대체 뭘까?

 

 

 

 

# self 키워드

self는 클래스의 인스턴스 자신을 가리킨다. 메서드의 첫 번째 매개변수로 사용되며, self를 통해서 나중에 클래스 내부의 변수와 메서드에 접근할 수 있습니다.

 

위의 예제 코드를 보면, Person 클래스를 선언한 다음 그걸 이용해서 Person1, Person2라는 인스턴스를 생성한다.

생성할 때 매개변수 중 self는 생략하고, 각각의 인스턴스에 해당하는 속성들(이름, 나이)를 매개변수로 전달해주면 된다.

 

이때 person1인스턴스에서는 person1이 self이고, person2 인스턴스에서는 person2가 self가 되는 것이다.  

 

그래서 특정 인스턴스의 속성들을 확인하고 싶을 때, print(self.변수이름) 이렇게 하면 되는데

이때의 self == 그 인스턴스 자기자신이다. 

print(person1.name)  # 출력: Alice
print(person1.age)   # 출력: 30
print(person2.name)  # 출력: Bob
print(person2.age)   # 출력: 25

 

 

 

# 클래스 상속: super 함수

super 함수는 부모 클래스의 메서드를 호출할 때 사용된다.

상속받은 클래스에서 부모 클래스의 메서드를 확장하거나 재정의할 수 있다.

 

class Parent:
    def __init__(self, name):
        self.name = name

    def display(self):
        print(f"부모 클래스: {self.name}")

class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def display(self):
        super().display()
        print(f"자식 클래스: 이름={self.name}, 나이={self.age}")

child = Child("홍길동", 20)
child.display()

 

 

위 코드에서는 class Child(Parent):  에서 Child 클래스가 Parent 클래스를 상속받고 있다.

 

1. def __init__(self, name, age): 에서

super를 사용하여 부모 클래스의 __init__ 메서드를 호출한다.

 

2. def display(self): 여기서

display 메서드를 재정의하여 부모 클래스의 display 메서드를 호출한 뒤 추가 정보를 출력한다.

 

해시 테이블

해시 테이블은 데이터를 저장할 위치를 결정하기 위해 간단한 연산을 사용하는 방법이다.

주어진 데이터를 특정한 연산(해시 함수)으로 변환해서 그 결과를 데이터가 저장될 인덱스로 사용한다.

이렇게 하면 좋은 점:

원소를 효율적으로 저장하고 검색할 수 있다.

 

예를 들어 해시 함수가 데이터를 10으로 나누어 나머지를 인덱스로 사용하는 경우,

 

"42"라는 데이터는 2번 인덱스에 저장된다. 이는 연산이 간단하고 빠르게 처리될 수 있기 때문에 해시 테이블은 많은 컴퓨터 과학 및 프로그래밍 문제에서 유용하게 사용된다.

 

 

 

정렬과 해시 테이블

해시 테이블은 본질적으로 정렬된 순서를 유지하지 않는다. 해시 테이블의 주요 목적은 데이터의 빠른 저장과 검색이다. 따라서 데이터가 삽입되는 순서나 정렬된 순서를 유지하지 않는다.

정렬된 순서가 필요할 때는 다음과 같은 방법을 사용할 수 있다:

 

 

  1. 정렬된 데이터 구조 사용: 해시 테이블 대신 이진 탐색 트리(예: AVL 트리, 레드-블랙 트리)와 같은 정렬된 데이터 구조를 사용한다. 이러한 데이터 구조는 삽입, 삭제, 검색 시에 정렬된 순서를 유지한다.
  2.  해시 테이블과 별도의 정렬된 리스트 사용: 해시 테이블에 데이터를 저장하면서, 별도의 리스트나 배열에 데이터를 삽입하여 이 리스트를 정렬된 상태로 유지한다.
  3. 데이터를 추출하여 정렬: 해시 테이블에 저장된 데이터를 한 번에 모두 추출한 후, 필요한 시점에 정렬한다.

 

 

파이썬에서 해시 테이블 역할을 하는 딕셔너리의 데이터를 정렬하는 예시:

 

# 해시 테이블에 데이터 삽입
hash_table = {'c': 3, 'a': 1, 'b': 2}

# 키를 기준으로 정렬
sorted_keys = sorted(hash_table.keys())

# 값(value)을 기준으로 정렬
sorted_values = sorted(hash_table.values())

print("키 기준 정렬:", sorted_keys)
print("값 기준 정렬:", sorted_values)

 

 

 

실행 결과:

키 기준 정렬: ['a', 'b', 'c']
값 기준 정렬: [1, 2, 3]

 

 

 

키 기준으로 정렬된 딕셔너리 생성하고 싶다면?

정렬된 키를 기반으로 새로운 딕셔너리를 생성하면 된다:

 

# 해시 테이블에 데이터 삽입
hash_table = {'c': 3, 'a': 1, 'b': 2}

# 키를 기준으로 정렬
sorted_keys = sorted(hash_table.keys())

# 정렬된 키를 기반으로 새로운 딕셔너리 생성
sorted_dict = {key: hash_table[key] for key in sorted_keys}

print("키 기준 정렬된 딕셔너리:", sorted_dict)


#결과
키 기준 정렬된 딕셔너리: {'a': 1, 'b': 2, 'c': 3}

 

 

 

해시 테이블은 빠른 데이터 저장과 검색을 위해 사용되며, 정렬된 순서를 유지하지 않는다. 그러나 필요에 따라 정렬된 데이터를 생성하거나, 정렬된 상태로 유지할 수 있는 방법을 사용할 수 있다. 

 

개행 없애는 법:

 

print('안녕하세요', end=' ')

 

 

 

리스트나 딕셔너리 정렬할 때 기준 값 설정하는 법:

 

fruits_list.sort(key=lambda x: x[0])

 

 

이거 두 개가 뭐라고 생각이 안 나서 시험볼 때 고생을 했다 ㅎㅎㅎ

문법 정리 노트 어제 만들었지만 다시 어디에 잘 적어두고 복습해야겠다.

 

 

 

 

#추가

문자열에서 'k'가 몇개 있는지 ?

a.count('k')

 

 

리스트 컴프리헨션

[ [ ], [ ], [ ], ....] 
arr = [ [ ] for i in range(100)]

[ [0], [0], [0], .....]
arr = [[0] for i in range(100)]

[0, 0, 0, 0, 0, ....]
arr= [ [0]*100]

[1, 2, 3, 4, 5, ....., 100]
arr = [i for i in range(100)]

[[0, 0, 0], 0, 0, 0], [0, 0, 0], [0, 0, 0]]
arr = [[0]*3 for _ in range(4))



 


리스트 관련 메서드

arr.append(x)
arr.sort()
arr.sort(reverse=True)
arr.sort(key = lambda x: x[1])
arr.reverse
arr.index(2, 3) #인덱스 2의 값을 3으로 
arr.count(x)
arr.remove(x)



*특정 값 모두 제거하기

# arr=[1, 2, 3, 3, 4, 5, 5, 5]에서 모든 3, 5를 제거하기
remove_set = {3, 5}
result = [i for i in arr if i not in remove_set]





튜플 자료형


성질이 서로 다른 데이터를 묶어서 관리할 때 용이하다. ex) (비용, 노드 번호)
한번 선언된 값은 변경할 수 없어서 우선순위 큐에서 사용하기도 한다.

 

 

 

딕셔너리 자료형

 

{'키':'값', '키':'값', ...}
해시테이블로 저장되기 때문에 원소 검색, 원소값 수정의 시간복잡도가 O(1)이다.

#키만 뽑아서 리스트로 만들기
arr= data.keys()

#값만 뽑아서 리스트로 만들기
arr= data.values()

 





집합 자료형

중복X, 순서X

data=set([1, 2, 3, 4, 5])
data = {1, 2, 3, 4, 5}

data.add(6)
data.update([6, 7])
data.remove(3)




* 딕셔너리와 집합은 순서가 없으므로 인덱싱으로 값을 얻을 수 없다. 

하지만 그래서 특정 원소가 존재하는지를 검사하는 연산의 시간복잡도는 딕셔너리와 조합에서 모두 O(1)이다. 

리스트나 튜플은 특정 원소가 존재하는지를 순회하면서 검색하면 O(n)만큼 걸리는 것에 비하면 엄청 빠르다.

 

 


빠르게 입력받기

import sys
sys.stdin.readline().rstrip()

 

리스트 안에서 문자- 숫자 자료형 변경하기

 

a = ['123', '456', '789']라고 할 떄, 

1. 리스트 안의 문자를 숫자로 변경하는 법

a = list(map(int, a))

2. 리스트 안의 숫자를 문자로 변경하는 법

a = list(map(str, a))

 




<파이썬 표준 라이브러리>


1. 내장 함수(import 없이 사용 가능)

 

input()

print()

sum() 
sum([2, 3, 4, 5, 6])  #sum 안의 이터러블 객테의 모든 원소의 합을 반환한다.

min()

max()

eval() 
eval("(3+5)*7") #eval 안의 수식을 계산한 결과를 반환한다.

sorted()
sorted([9, 8, 3, 7, 2]) #이터러블 객체 오름차순으로 정렬
sorted([9, 8, 3, 7, 2], reverse = True) #이터러블 객체 내림차순으로 정렬
sorted([('길동', 35), ('순신', 75), ('아무개', 50)], key = lambda x: x[1], reverse = True) #원소를 튜플의 두번째 원소를 기준으로, 내림차순으로 정렬
#이것은
arr.sort(key = lambda x: x[1], reverse = True) 와 같다.



2. itertools

from itertools import 메서드 이름

from itertools import *



1) 순열: permutations

arr=[ 'A', 'B', 'C' ]
res = list(permutations(arr, 3))  #array에서 3개를 뽑아 나열하기
res = list(product(arr, repeat = 3)) #array에서 3개를 뽑아 중복을 허용하여 나열하기

 

 


2) 조합: combinations

arr=[ 'A', 'B', 'C']
res = list(combinations(arr, 3)) #array에서 원소 3개를 뽑기
res = list(combinations_with_replacement(arr, 3)) #array에서 원소 3개를 중복 허용해서 뽑기





3. heapq

힙으로 오름차순, 내림차순 정렬할 때의 시간복잡도: O(NlogN)

import heapq


#최소힙 구현
def heapsort_min(iterable):
h=[ ]
result =[ ]
for value in iterable:
heapq.heappush(h, value)
for i in range(len(h)):
result.append(heapq.heappop(h))
return result


#최대힙 구현
def heapsort_max(iterable):
h=[ ]
result = [ ]
for value in iterable:
heapq.heappush(h, -value)
for i in range(len(h)):
result.append(-heapq.heappop(h))
return result

 

 

 


4. bisect

정렬된 배열에서 특정 원소 찾을 때 유용한 이진탐색을 구현한다. 
bisect_left(), bisect_right()는 모두 시간복잡도 O(logN)으로 동작한다. 

 

from bisect import bisect_left, bisect_right

arr=[1, 2, 4, 4, 8]

print(bisect_left(arr, 4))  #4를 삽입할 수 있는 가장 왼쪽 인덱스? == 2
print(bisect_right(arr, 4)) #4를 삽입할 수 있는 가장 오른쪽 인덱스? == 4

 

from bisect import bisect_left, bisect_right

def count_by_range(arr, left_value, right_value):
right_index = bisect_right(arr, right_value)
left_index = bisect_left(arr, left_value)
return right_index - left_index

arr=[1, 2, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 9]

print(count_by_range(a, 4, 5)) #값이 4 또는 5인 데이터 개수 출력

 



5. collections

 



1) deque

from collections import deque

queue = deque([2, 3, 4])
queue.appendleft(1) #가장 왼쪽에 1 추가
queue.append(5) #가장 오른쪽에 5 추가

print(list(queue)) #일반적인 리스트 자료형으로 변환



2) Counter

from collections import Counter
iterable 객체 내부에서 특정 원소가 몇 번 등장하는지 세는 메서드

from collections import Counter

counter['a']




6. math

수학 계산 해주는 내장함수

import math 

math.factorial(x) #팩토리얼 구하기

math.sqrt(x) #제곱근 구하기

math.gcd(21, 14) #최대공약수 구하기

math.pi #파이값 출력

 

 

 

 

 

 

출처: 

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 예스24 (yes24.com)

 

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 예스24

나동빈 저자의 유튜브 라이브 방송 https://www.youtube.com/c/dongbinnaIT 취준생이라면 누구나 입사하고 싶은 카카오 · 삼성전자 · 네이버 · 라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다!IT 취준생

www.yes24.com

 

먼저 

import sys

를 해준다.

input= sys.stdin.readline 이렇게 하면 split될 때마다 자동으로 개행문자가 삽입되어서 입력이 제대로 안 된다. 

 

 

해결방법 1 

 

strip()으로  개행문자를 제거하기 위해서 새로운 함수를 정의한다.

def input():
    return sys.stdin.readline().strip()

 

 

 

해결방법 2

 

간단하게 익명함수를 정의하는 lambda 키워드를 사용할 수 있다. 

input = lambda: sys.stdin.readline().strip()

 

 

 

해시

입력 데이터를 고정된 크기의 고유한 값(해시값)으로 변환한 것

 


해시 함수

입력받은 데이터를 고유한 해시 값으로 출력시키는 함수


파이썬에서 해시 문제를 풀 때는 딕셔너리를 사용한다. 
딕셔너리는 중괄호 안에 키-값 쌍을 저장하는데 이때 키를 해시하여 값을 빠르게 검색할 수 있다. 

 

 

 


딕셔너리 사용법

 


1. 딕셔너리 생성

dict = { } #빈 딕셔너리 생성




2. 새로운 키-값 쌍 추가

dict["new_key"] = "new_value"




3. 값을 업데이트 하기

dict["key1"] = "updated_value"



4. 딕셔너리 값에 접근할 때는 키를 사용한다. 

 

value = dict["key1"]

value = dict.get["key1"]
value = dict.get("key1", "default_value")




5. 딕셔너리에서 요소를 삭제하기

del dict["key1"]   #키를 이용해서 삭제

value = dict.pop("key1", "default_value")  #pop() 메서드로 삭제하며 값을 반환

dict.clear()   #딕셔너리 안의 모든 요소 삭제





6. 딕셔너리 순회하는 법

# 키 순회
for key in my_dict:
    print(key, my_dict[key])

# 값 순회
for value in my_dict.values():
    print(value)

# 키-값 쌍 순회
for key, value in my_dict.items():
    print(key, value)




딕셔너리는 내부적으로 해시 테이블을 사용하여 키를 해시하고, 

해시 값을 인덱스로 변환하여 값을 저장한다. 

 

이렇게 하면 평균적으로 O(1)의 시간 복잡도로 키-값 쌍에 접근할 수 있다!

+ Recent posts