[내일배움캠프] 20일 차 - Python 알고리즘 코드카타, 파이썬 특강 4강, 아티클 스터디
Python 알고리즘 코드카타
문제 39
최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
처음 답안 (틀림)
def solution(n, m):
answer = []
n = max(n, m) # 재할당 문제
m = min(n, m)
x = (n * m)
if n % m == 0:
gcd = m
else:
while n % m != 0: # else와 같은 내용을 while에 씀
n = m # 재할당 문제
m = n % m
gcd = n
lcm = x / gcd
answer.append(gcd)
answer.append(lcm)
return answer
최종 답안
def solution(n, m):
answer = []
x = (n * m)
if n % m == 0:
gcd = m
else:
while m != 0:
n, m = m, n % m # 재할당 해결법
gcd = n
lcm = x / gcd
answer.append(gcd)
answer.append(lcm)
return answer
틀린 이유
1. 재할당 문제로 원래의 의도가 코드에 반영되지 못함
2. else절에 쓴 조건을 while절에서 반복해서 사용 → 무의미한 조건
개선점
1. 재할당 문제 해결법
- 여러 변수를 동시에 할당한다.
# 재할당 문제
n = max(n, m)
m = min(n, m)
# 해결
n, m = max(n, m), min(n, m)
# 재할당 문제
n = m
m = n % m
# 해결
n, m = m, n % m
2. 조건문
- if-elif-else
- 앞의 조건이 참이 아닐 때, 다음 조건으로 넘어간다
- elif 절의 조건은 사실상 not if condition AND elif condition
- else 절의 조건은 사실상 not if condition AND not elif condition
- if 절 안의 while 문
- while 문의 조건은 사실상 if condition AND while condition, not while condition이면 멈춤
새롭게 알게 된 것
1. 최대공약수(GCD) 찾기
- 유클리드 호제법 (Euclidean Algorithm)
- 두 자연수 a와 b의 최대공약수(GCD) 찾기
- 핵심 원리:
두 자연수 a와 b (단, a > b라고 가정)
a와 b의 최대공약수는 b와 a를 b로 나눈 나머지의 최대공약수와 같다.
1-1. 최대공약수 알고리즘
- 두 자연수 a와 b가 (보통 a > b)
- r = a를 b로 나눈 나머지
- 만약 r이 0이라면, 이때의 b가 최대공약수 (알고리즘 종료)
- 만약 r이 0이 아니라면, 이제 원래의 b를 새로운 a로, 그리고 r을 새로운 b로 바꾼다.
- 이 과정을 r이 0이 될 때까지 반복
2. 최소공배수(LCM)
- 두 자연수 a와 b의 최소공배수(LCM) 찾기
- 두 수 a, b의 곱을 최대공약수(GCD)로 나눈 값
- LCM(a, b) = (a * b) / GCD(a, b)
- 참고 자료
Gemini 검색
파이썬 특강 4강
파이썬 특강 4강 : 임정 튜터님
지난 교육생 인터뷰
- 부트캠프에서 했던 프로젝트를 이후 스스로 정리
- 1년 동안 PPT 디자인, 공모전, 데이터 분석 공부 강의 들으며 정진
- 이력서 / 포트폴리오가 문서로서의 완성도가 매우 높았음
1. 정의
1.1 함수의 종류와 구성요소
- 정의: 프로그램 소스 코드에서 일정한 동작을 수행하는 코드
- 종류
- 내장 함수(built -in function)
- 파이썬에 사전에 정의된 함수
- 기본적인 필요한 함수가 정의 되어있고 성능도 좋음
- 예시) len(), print()
- 사용자 정의 함수(user define function): 사용자가 필요해서 만든 함수
1.2 함수의 구성 요소
- Input: 파라미터(parameter)
- 기능
- Output: 리턴 값(return)
- 문법
def 함수명(파라미터):
'''코드구문'''
return
- 예시
def get_square(x): # 함수 정의
return x**2
get_square(3) # 함수 실행
>>> 9
- get_square
- 함수명
- 변수의 정의 규칙과 동일하게 영어 혹은 _ 사용해 만듦
- 내장 함수 동일한 이름 사용 금지
- x
- 함수의 Input
- 함수 내부 코드의 변수의 역할
- return
- 반환
- 함수의 기능이 종료되고 내보낼 값
- 위 경우에서는 들어온 x값을 제곱해서 내보냄
- return에 도달하면 함수 종료 → 이후 코드는 실행되지 않음
- get_square의 3
- 전달 인자(Argument)
- 파라미터가 직접 정의된 경우
1.3 return과 print의 차이
- return
- 함수를 바로 종료시키면서 반환
- print
- 출력만 하고 반환하지 않음
2. 함수의 추가 정보
2.1 여러 개의 값 리턴하기
- 쉼표(,)로 여러 개 리턴 가능
- 여러 개의 값 리턴할 때 반환하는 결과형은 튜플
def get_square(x):
return x, x**2 # 쉼표
>> (3, 9) # 튜플
2.2 전역 변수와 지역 변수
- 전역 변수(Global Variable)
- 파이썬 코드 전체에서 적용되는 변수
- 함수 안에서 활용 가능
- 지역 변수(Local Variable)
- 함수 구문 내에서만 적용되는 변수
- 함수 안에서 선언된 변수는 함수 밖에서 사용할 수 없음
2.3 전달 인자의 종류
- 위치 전달인자(Positional Argument)
- 전달하려는 위치가 중요
- 함수 전달 인자 순서에서 앞에 위치
- 키워드 전달 인자(Keyword Argument)
- 위치가 중요하지 않고 keyword 기준
- 키워드 전달 인자는 default 값을 설정 가능
- 함수를 실행시킬 때 변경 가능
# *는 위치 전달인자
print('*')
# end는 키워드 전달인자
# 기본 옵션이 개행(엔터)
# 아래 코드와 동치
print('*', end = '\n')
# 위치 전달인자가 첫번째에 오지않으면 에러
print(end = '\n', '*')
# 키워드 전달인자 default 값 있음, 따로 설정하지 않을 때
def get_square(x, my_string ='x의 제곱은'):
print(my_string)
return x**2
get_sqaure(3)
>> x의 제곱은
9
# 키워드 전달인자 default 값이 있음, 따로 설정해서 변경
def get_square(x, my_string ='x의 제곱은'):
print(my_string)
return x**2
get_square(3, my_string = '결과값은')
>> 결과값은
9
2.4 함수의 설명서 - Docstring, Type Hint
- Docstring(독 스트링)
- 함수 설명서
- 여러 줄 주석 쌍따옴표 3쌍 ''' ''' 로 선언
def get_square(x):
'''
이 코드는 제곱하는 코드입니다.
Parameters:
x (int): 제곱할 정수
Returns:
int: 제곱된 정수 결과
'''
return x**2
- Type Hint(타입 힌트)
- 함수에 들어가는 전달 인자와 나오는 리턴 값의 자료형을 명시하는 기법
- 전달 인자와 리턴 값에 자료형을 명시, 하지만 강제는 아님
def get_square(x: int) -> int: # (x: int) -> int
'''
이 코드는 제곱하는 코드입니다.
Parameters:
x (int): 제곱할 정수
Returns:
int: 제곱된 정수 결과
'''
return x**2
3. 문제 풀기
3.1 없는 숫자 더하기
def solution(numbers):
answer = sum(range(0, 9+1)) - sum(numbers)
return answer
3.2 나머지가 1이 되는 수 찾기
def solution(n):
for x in range(1, n+1):
if n % x == 1:
answer = x
break
return answer
자료 출처
스파르타 코딩클럽 데이터 Docs
아티클 스터디
[아티클]
양질의 데이터를 판별하는 5가지 방법: ⑤ 목적에 적합한 데이터인가?
[요약]
서론
분석과 활용 목적에 적합한 데이터 판별하는 기준을 알아보자.
데이터에 원하는 정보가 담겨 있는가?
- DIKW 피라미드 이론
- 데이터(Data), 정보(Information), 지식(Knowledge), 지혜(Wisdom)
- 데이터 중 일부만 정보, 정보 중 일부만 지식으로, 지식 중 일부만 지혜로 활용됨
- 분석하고자 하는 내용이 충실히 담긴 데이터를 지식, 지혜로 발전시키는 것이 좋다.
- 즉, 분석하고자 하는 내용이 충실히 담기지 않은 데이터는 저품질의 데이터로 판별할 수 있다.
- 데이터 VS 분석가
- 분석가의 수준에 따라 인사이트를 도출하는 능력이 다르다.
- 분석가의 역량에 따라 같은 데이터의 질을 다르게 판단하기도 한다.
분석 방법에 부합하는 데이터인가?
분석 방법에 부합하는 구조를 가진 데이터가 양질의 데이터이다.
활용 목적에 부합하는 내용을 가졌어도 분석 방법론에 적합한 형식이 아니면 분석하기 어렵다.
- 머신러닝을 위한 빅데이터
- 머신러닝의 목표: 미래 상황 사전 예측
- 머신러닝 데이터
- 데이터의 양이 충분해야 한다
- 데이터에 종속 변수가 존재해야 한다
- 인사이트 도출을 위한 빅데이터
- 분석 방향에 따라 데이터 활용성이 변한다
- 활용 가치 높은 정보를 찾을 때는 지수(index) 개념을 이용
- 코스피 지수를 활용하여 우리나라 전체 주식의 인사이트 발견 가능
- 지수는 가공된 데이터 어느 정도 가공된 데이터가 인사이트 도출 시 유리함
분석 목적이 명확하지 않으면 데이터 품질을 논할 수 없다
양질의 데이터 판단하는 기준 중 가장 중요한 것은 분석 목적이다.
[핵심 개념 및 용어 정리]
DIKW 피라미드 이론
지식 피라미드(knowledge pyramid)는 데이터→정보→지식→지혜의 단계로 이루어진 계층적 모델이다. 이 모델은 데이터가 정보로 변환되며, 정보가 지식이 되고, 궁극적으로 지혜로 발전하는 과정을 설명한다.
DIKW 피라미드는 데이터로부터 의미 있는 지식과 지혜를 만들어 가는 과정으로서 표현된다. 여기서 D는 데이터(data), I는 정보(information), K는 지식(knowledge), W는 지혜(wisdom)이다. DIKW 피라미드는 데이터가 축적되고 추상화되어 어떻게 새로운 통찰을 주는지를 설명한다. 데이터는 가장 객관적인 반면에 지혜는 가장 추상적이다.
미래를 위해 행동하게 하는 지혜
지혜는 단순한 정보나 지식의 축적이 아니라, 이를 비판적으로 분석하고 통찰력을 발휘하여 바람직한 행동이나 결정을 이끌어내는 과정을 포함한다. 즉, 지혜를 갖춘 사람은 과거의 경험, 윤리적 판단, 직관, 논리적 사고를 종합하여 복잡한 문제를 해결하고, 보다 나은 방향으로 나아가기 위한 선택을 할 수 있다.
지혜는 여러 지식을 결합하고 학습한 후, 여기에 본인의 통찰을 추가해 미래를 위한 최선의 결정(행동)을 할 수 있게 하는 것이다. 데이터와 정보는 각각 한 모금의 물과 생수병의 물과 같이 갈증이 날 때마다 마시는 것과 같다. 지식은 갈증날 때마다 물을 마실 수 있는 우물과 같으며, 지혜는 갈증 없이 영원히 물을 마시는 방법, 즉 우물을 파는 법과 같다.
지혜의 주요한 특징
- 비판적 사고와 통찰력
지혜는 단순히 사실을 아는 것이 아니라 그 의미를 이해하고 적절히 판단하는 능력이다. 지식이 있는 사람은 문제의 원인을 분석할 수 있지만, 지혜로운 사람은 그 문제를 해결할 방법을 찾는다. - 미래를 고려한 의사결정
지식은 현재 상황을 분석하는 데 초점을 맞추지만, 지혜는 장기적인 결과를 고려한 결정을 내리는 능력을 포함한다. 예를 들어, 의사는 질병에 대한 정보를 가지고 있지만, 환자의 생활습관과 정신적 건강까지 고려해 최적의 치료 방법을 제시하는 것이 지혜에 해당한다. - 윤리적 도덕적 가치 판단
지혜는 단순히 ‘효율적인 해결책’을 찾는 것뿐만 아니라, 올바른 결정과 윤리적인 판단을 포함한다. 기업이 수익을 극대화하는 방법(지식)은 알고 있지만, 사회적 책임을 고려하여 지속 가능한 경영을 실천하는 것이 지혜이다.
자료 출처
[인사이트]
지난 5개의 아티클을 읽으며 데이터 분석 과정에서 사용할 양질의 데이터를 판별하는 기준을 알 수 있었다. 부트캠프에서 진행한 기초 분석 프로젝트에서도 기준 중 일부를 적용했던 기억이 난다. 프로젝트 진행 과정을 복기해보았다.
우선 테이블을 살펴보며 팀원들이 가능한 분석 주제를 가볍게 이야기하는 브레인스토밍 과정을 거쳤다. 분석 주제를 선정한 다음, 테이블에서 분석 방향과 일치하는 컬럼만 남겼다. 분석 목적과 일치하는 컬럼만 양질의 데이터로 판별한 것이다. 인사이트를 찾기 위해 데이터를 가공한 뒤, 엑셀로 가볍게 시각화한 결과를 보며 의견을 주고받았다. 가공된 데이터가 인사이트 도출 시 유리하다는 것을 확인했던 것이다.
기초 분석 프로젝트 진행 때는 데이터 판별 기준을 모르는 상태였다. 아티클을 통해 구체적인 기준을 알게 되었으니, 이를 다음 프로젝트에 적용해 조금 더 체계적인 분석을 할 수 있지 않을까 기대한다.