Coding/TIL & 배운것들

베이직반 수업 11-18

코딩짜는 머글 2024. 11. 19. 20:33

코드카타 문제 풀이 

 

1. 홀짝에 따라 다른 값 반환하기 

▼ 문제 : 양의 정수 n이 매개변수로 주어질 때, n이 홀수라면 n 이하의 홀수인 모든 양의 정수의 합을 return하고 n이 짝수라면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 return 하는 solution 함수를 작성해 주세요. 

 

▼ 풀이

# 풀이 1
def solution(n):
    answer = 0
    if (n%2==1) : # n이 홀수라면
        for i in range(n, 0, -2) : # ex) 7 -> 5 -> 3 -> 1 
            answer += i
    else: # n이 짝수라면
        for i in range(n, 0, -2) : # ex ) 10 -> 8 -> ... ->  4 -> 2
            answer += (i**2)
    return answer
# 풀이 2
def solution(n):
    if n%2:
        return sum(range(1,n+1,2)) # 시작점에 따라 홀짝을 구분
    return sum([i*i for i in range(2,n+1,2)])
# 풀이 3번
def solution(n):
    int_list = range(n+1)
    if n % 2 == 1: # 홀수일때
        return sum(int_list[1::2]) #1부터 시작해서 2씩 건너뛴 요소들 ex) sum(1, 3, 5, 7, ..)
    else: # 짝수일때
        a = 0
        for i in range(len(int_list[0::2])): #0부터 시작해서 2씩 건너뛸때
            a += int_list[0::2][i]**2
        return a

 

 

2. 조건 문자열

▼ 문제 : 문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다. 

  • 두 수가 n과 m이라면
    • ">", "=" : n >= m
    • "<", "=" : n <= m
    • ">", "!" : n > m
    • "<", "!" : n < m

두 문자열 ineq와 eq가 주어집니다. ineq는 "<"와 ">"중 하나고, eq는 "="와 "!"중 하나입니다. 그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해주세요.

 

▼ 풀이

# 풀이 1
def solution(ineq, eq, n, m):
    answer = 0

    if (ineq == '>' and eq == '='):
        answer = 1 if n >= m else 0
    elif (ineq == '<' and eq == '='):
        answer = 1 if n <= m else 0
    elif (ineq == '>' and eq == '!'):
        answer = 1 if n > m else 0
    elif (ineq == '<' and eq == '!'):
        answer = 1 if n < m else 0

    return answer
# 풀이 2: eval() = 문자열로 된 표현식을 실행하는 함수
def solution(ineq, eq, n, m):    
    return int(eval(str(n)+ineq+eq.replace('!','')+str(m))) # eval 함수의 결과값이 참이라면 True일 것이고, eval함수의 결과값이 거짓이라면 False일 것

 

 

3. 코드 처리하기 

문제 : 문자열 code가 주어집니다.
code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.

mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.

  • mode가 0일 때 
    • code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
    • code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.
  • mode가 1일 때
    • code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
    • code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.

문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.

단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.

 

▼ 풀이

# 풀이 1
def solution(code):
    result = ''
    mode = 0
    for i in range(len(code)):
        if mode == 0 :
            if code[i] != '1' and i % 2 == 0:
                result += code[i]
            elif code[i] == '1':
                mode = 1
        else :
            if code[i] != '1' and i % 2 == 1 :
                result += code[i]
            elif code[i] == '1':
                mode = 0
    if result == '':
        return 'EMPTY'
    return result
# 플이 2
def solution(code):
    return "".join(code.split("1"))[::2] or "EMPTY"

 

 

for문 한줄로 리스트 만들기 (리스트 컴프리핸션)

[표현식 for 변수1 in 객체1 if 조건문1
            for 변수2 in 객체2 if 조건문2
            ......
            for 변수n in 객체n if 조건문n]

 

표현식(expression) : 새로운 리스트의 각 항목을 어떻게 변환할지 결정

for 변수 in 반복가능한 객체 : 반복문에서 각 요소를 하나씩 가져옴

if 조건식(선택사항) : 특정 조건을 만족하는 요소만 포함

위와 같이 for 변수 in 객체 if 조건문은 2개 이상으로 구성할 수도 있다. if 조건문은 생략 가능함

 

▼ 예제

a = 'abcde'
b = [val + 'k' for val in a]
print(b)  # ['ak', 'bk', 'ck', 'dk', 'ek']

a = [x**2 for x in range(1, 11) if x % 2 == 0]
print(a)  # [4, 16, 36, 64, 100]

a = [x**2 for x in range(1, 6)]
print(a)  # [1, 4, 9, 16, 25]

words = ["python", "is", "fun"]

result3 = [word.upper() for word in words]
print(result3)  # ['PYTHON', 'IS', 'FUN']

# 이중리스트 flatten 작업. [1,2,3,4,5,6]으로 만들기
nested_list = [[1, 2], [3, 4], [5, 6]]  
flat_list = [item for sublist in nested_list for item in sublist]
print(flat_list)  # [1, 2, 3, 4, 5, 6]

a1 = [1, 2, 3]
a2 = [6, 7 ,8]
b = [val1 + val2 for val1 in a1 if val1 < 3
		 for val2 in a2 if val2 < 7]
print(b)

# 출력값 : [7, 8]
# (val1, val2) 순서는 (1,6), (1,7), (1,8), (2,6), (2,7), (2,8), (3,6), (3,7), (3,8) 이며,
# 각 조건문에 따라 (1,6)과 (2,6)만 채택됨

 

 

▼ Boolean 자료형

while, if 등은 조건문 안의 내용의 True/False 여부에 따라서 아래 내용을 실행할지를 결정한다. 

 

다양한 자료형

  • "python" : True
  • "" : False
  • [1,2,3] : True
  • [] : False
  • (1,2,3) : True
  • () : False
  • 1 : True
  • 0 : False
  • None : False
  • 1==1 : 계산결과 True
  • 1 < 3 : 계산결과 True
  • 1 > 3 : 계산결과 False

▼ 예제 

a = [1,2,3,4,5]
while a : # while (조건문) : 
  print(a.pop())  
  
# 출력
5
4
3
2
1

리스트 a 가 빈 리스트[]가 될때까지는 while문 조건식이 True이다. 하지만 pop()을 반복하여 리스트 a가 빈리스트가 되면 while문 안의 조건식이 False가 되어 while문이 멈추게된다. 

 

▼ 예제 

if [] : 
  print("True")
else : 
  print("False")
  
  # 출력
  False

if문 조건식에 빈 리스트가 들어가면 False가 되므로 else문이 출력된다.