두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3+4+5 = 12이므로 12를 리턴합니다.
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()을 활용해봐야겠다.
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

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을 리턴하는 함수를 완성하세요.
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
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)**2 가 True이면 int(n**.5+1)**2를 평가한다. int(n**.5+1)**2 이 True이면 -1은 평가할 것도 없이 int(n.5+1)2 값을 반환한다.
👉 n == int(n**.5)**2 가 False이면 int(n**.5+1)**2는 평가할 것도 없이 -1을 평가하고 반환한다.
참고로 -1도 True이다.
이 코드가 True나 False 대신 정수를 반환하는 이유는 파이썬의 논리 연산자(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 값을 반환.