[Python] 수학 카테고리 기초 문제 2개 - 프로그래머스 Lv.1

Coding Test

목록 보기
4/16
2024년 6월 작성

두 정수 사이의 합

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.

예를 들어 a = 3, b = 5인 경우, 3+4+5 = 12이므로 12를 리턴합니다.

1️⃣ 내 코드

def solution(a, b):
    answer=0
    if a<=b:
        for i in range(a, b+1):
            answer += i
    else:
        for i in range(b, a+1):
            answer +=i
            
    return i

💡 for문 돌려서 그냥 범위 안의 정수 더하기.

💬 다른 분들의 코드를 참고해보니 나도 다음엔 직접 더하기보다는 sum()을 활용해봐야겠다.


2️⃣ 다른 코드

① sum(range())

a, b 바꿔 대입, sum(range())

def solution(a, b):
    if a > b:
        a, b = b, a
    return sum(range(a, b + 1))

② 수열의 합 공식

👉 두 정수 a, b 사이의 모든 정수의 합 = {n(a+b)}/2 ( n : 항의 개수)

def solution(a, b):
    return (abs(a-b)+1)*(a+b)//2


③ min(), max(), sum(range())

def solution(a, b):
    return sum(range(min(a, b), max(a, b)+1))

④ 삼항 조건 연산자

def solution(a, b):
    return sum(range(a,b+1) if a <= b else range(b,a+1))

⑤ 재귀 호출

def solution(a, b):
    if(a>b):
        return solution(b,a)
    return sum([i for i in range(a,b+1)])

✅ List Comprehension
Python에서 새로운 리스트를 생성하는 간결하고 효율적인 방법.

# List Comprehension의 기본 구조
[expression for item in iterable if condition]
# 0부터 9까지의 숫자 중 짝수의 제곱을 포함하는 리스트를 생성
even_squares = [x**2 for x in range(10) if x % 2 == 0]

✅ 반복문에서 List Comprehension을 이용하면 생기는 특이점
: 새로운 리스트를 만듦

# 첫 번째 for문의 경우 :
# List Comprehension을 사용하여 새로운 user_input 리스트를 생성한다.
# 즉, 원래의 user_input을 변경하지 않고 새로운 리스트를 만든다.
for item in user_input:
	if item in cambridge:
		user_input = [value for value in user_input if value != item]
#
# 반면, 두 번째 for문의 경우 : 
for item in user_input:  
# 두 줄 아래에서 바뀐 user_input을 반영하여 리스트의 다음번째 index를 조회하므로
# 모든 글자를 조회하지 못함.
	if item in cambridge:
		user_input.remove(item)
#
# remove() 메서드를 사용하여 원래의 user_input 리스트를 직접 변경한다.
# 따라서 첫 번째 for 루프를 실행하는 동안 user_input이 변경되어,
#
# 원래의 리스트에서 요소가 제거되었기 때문에
# 두 번째 for문에서는 원래의 리스트의 길이보다 작아진 새로운 길이를 기준으로
# 반복이 이루어지게 된다.

그렇게 되는 이유
for item in user_input : 이 부분에서 💫 for가 시작될 때 이미 리스트의 iterator가 만들어졌기 때문에 user_input의 초기 상태가 기준이 된다.
그 후 user_input = [리스트 컴프리헨션]은 새로운 리스트를 만들어 같은 변수명에 다시 할당했다.

→ 이건 기존 리스트 객체를 바꾸는 것이 아니라, 💫 새로운 리스트 객체를 가리키게 한 것이다.
💫 for문이 사용하는 iterator는 옛날 리스트를 참조하고 user_input이 가리키는 리스트는 새 객체로 바뀐 상태이다. user_input이라는 변수는 하나인데 참조 대상이 달라진 상황이다.

결과적으로:
user_input이란 이름이 “다른 리스트”를 가리키게 되지만,
for 루프는 여전히 원래 리스트를 순회하고 있다. 따라서 루프의 안정성이 유지된다. (모든 요소가 정상적으로 확인됨)

반면, 두 번째 for문에서는 remove()로 리스트 자체를 직접 수정(in-place)한다. 따라서, for 루프가 내부적으로 사용하는 인덱스 순회 기준이 꼬여서 반복문 중 일부 요소가 건너뛰어진다.




정수 제곱근 판별

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

1️⃣ 내 코드

def solution(n):
    import math
    X = math.sqrt(n)
    if X%1 == 0 :
        answer = (X+1)**2 
    else:
        answer = -1
    return answer

내 것과 유사한데 간결한 GPT의 코드

def solution(n):
	sqrt = n ** 0.5
    if sqrt == int(sqrt):
    	return int(sqrt + 1) ** 2
    else:
    	return -1

2️⃣ 다른 코드

return A and B or C 의 반환💫

: 값을 선택적으로 반환하는 '삼항 연산자' 대체 구문이다.

def solution(n):
    return n == int(n**.5)**2 and int(n**.5+1)**2 or -1

👉 n**.5 : n**0.5 (n의 제곱근)

👉 만약 n이 완전제곱수라면 n == int(n**.5)**2 여야 한다.

💡 return 부분을 A and B or C라고 했을 때, 💫 A가 True이면 B를 반환하고 A가 False이면 C를 반환한다. 그 이유는 후술할 and, or의 동작 방식 때문이다.

✅ Python의 논리 연산자 and, or 동작 방식
1. and 연산자:
A and B 표현식에서 A가 False로 평가되면 B를 평가하지 않고 A를 반환한다.
▪ A가 True로 평가되면 B를 평가한 후 B의 값을 반환한다.
2. or 연산자:
A or B 표현식에서 A가 True로 평가되면 B를 평가하지 않고 A를 반환한다.
▪ A가 False로 평가되면 B를 평가한 후 B의 값을 반환한다.

👉 n == int(n**.5)**2True이면 int(n**.5+1)**2를 평가한다. int(n**.5+1)**2True이면 -1은 평가할 것도 없이 int(n.5+1)2 값을 반환한다.

👉 n == int(n**.5)**2False이면 int(n**.5+1)**2는 평가할 것도 없이 -1을 평가하고 반환한다.
참고로 -1도 True이다.

이 코드가 TrueFalse 대신 정수를 반환하는 이유는 파이썬의 논리 연산자(and, or)가 불리언이 아닌 실제 피연산자의 값을 반환하기 때문이다. 불리언 반환이 목적이라면 ==, is, <, > 등 비교 연산자로 끝내는 형태로 쓰면 된다.

② 삼항 조건 연산자

이게 더 명확하고 직관적인 것 같다.

import math
def solution(n):
    return -1 if not math.sqrt(n).is_integer() else (math.sqrt(n)+1)**2

✅ 삼항 조건 연산자
if not math.sqrt(n).is_integer() 조건이 참이면 -1을 반환, 거짓이면 (math.sqrt(n) + 1) ** 2 값을 반환.

profile
학습 메모장 : 코테 및 알고리즘, 언어 문법, Java 기본 강의...

0개의 댓글