OFMY (Ony for me and you)

1일차: 프로그래머스 코딩 테스트 Python - Level 1 본문

카테고리 없음

1일차: 프로그래머스 코딩 테스트 Python - Level 1

선뭉 2025. 3. 7. 20:50

1. 문제 설명

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

제한 조건
  • s의 길이는 1 이상 5이하입니다.
  • s의 맨앞에는 부호(+, -)가 올 수 있습니다.
  • s는 부호와 숫자로만 이루어져있습니다.
  • s는 "0"으로 시작하지 않습니다.
입출력 예

예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.

 

1 차 시도

def solution(s):
    s = []
    answer = 0
    answer = s[0] + s[1] + s[2] + s[3]
    return answer

IndexError: list index out of range 

이유:  

1. s = []로 리스트를 초기화하는 문제

 s를 빈 리스트로 만들어서 기존 입력값이 사라짐.

 이후 s[0], s[1] 등을 접근하려 하면 IndexError(인덱스 오류) 발생.

2. 빈 리스트에서 인덱스를 접근하는 문제

 s[0] + s[1] + s[2] + s[3]에서 s가 빈 리스트라 접근이 불가능함.

 

정답

def solution(s):
    answer = int(s)
    return answer

 

✅ int(s)가 문자열을 정수로 변환할 수 있기 때문

 int(s)는 문자열 s를 정수로 변환하는 Python의 기본 기능입니다.

 s "+123", "-45", "6789"처럼 숫자로 이루어져 있다면, int(s)는 이를 정수로 바꿉니다.

 

✅ 부호(+, -)가 포함된 문자열도 int()가 자동 변환

 int("+123")  123

 int("-45")  -45

 int("6789")  6789

 부호가 있어도 int()가 정상적으로 변환 가능하므로 별도의 처리 필요 없음

 

✅ 입력 조건을 모두 만족

1. 길이 1~5 이하 → 문제에서 보장

2. 부호(+, -)가 올 수 있음  int()가 자동 처리

3. 숫자로만 이루어짐  int()는 숫자가 아닌 문자가 포함되면 에러 발생

4. “0”으로 시작하지 않음 → 문제에서 보장

 

다른 풀이 

def strToInt(str): 
    result = 0
    for idx, number in enumerate(str[::-1]):
        if number == '-':
            result *= -1
        else:
            result += int(number) * (10 ** idx)
    return result


# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(strToInt("-1234"));

 

enumerate(str[::-1]): 문자열을 거꾸로 반복

 str[::-1] → 문자열을 뒤집음

 enumerate() → **각 자리의 위치(지수)**를 같이 가져옴

 

✅ 정리

1. 문자열을 뒤집고(str[::-1]), 각 자리의 숫자 값을 더함.

2. '-'가 있으면 마지막에 음수로 변환.

3. int() 없이 직접 변환하는 방식이지만, int(str)를 쓰면 훨씬 간단함.

 

 


2. 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

 

1차시도 

def solution(n):
    answer = 0
    for i in range(1, n):
    if n % i == 0: 
        answer += i
    else: 
        i += 1
        
    return answer

 

❌ 문제점

1. 들여쓰기 오류 (if문 아래 코드)

 if 문 안의 answer += i가 들여쓰기가 맞지 않아서 IndentationError 발생 가능

 if 문이 끝났는데 else 안에서 i += 1을 하는 것은 의미 없음 (for문에서 자동 증가됨)

2. 범위 문제 (range(1, n))

 range(1, n)이므로 n은 포함되지 않음.

 문제에서 n을 포함해야 한다면 range(1, n+1) 사용 필요.

 

2차 시도

def solution(n):
    answer = 0
    for i in range(1, n+1):
        if n % i == 0: answer += i
        
    return answer

 

 

다른사람 풀이

def sumDivisor(num):
    # num / 2 의 수들만 검사하면 성능 약 2배 향상잼
    return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])

num // 2 num을 2로 나눈 값을 정수로 구한 값

 


3. 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

def solution(n):
    answer = 0
    n = str[n]
    for i in in: 
        answer += i
    return answer

 

1. n = str[n]: 이 부분은 문법 오류입니다. n을 문자열로 변환하려면 str(n)이라고 해야지, n을 배열처럼 접근하려고 하면 안 됩니다. str[n]이 아니라 str(n)으로 고쳐야 합니다.

2. for i in in:: 이 부분도 문법 오류입니다. in은 파이썬에서 예약어로 사용할 수 없고, 대신 문자열을 순회하려면 for i in str(n):처럼 n을 문자열로 바꿔서 i에 각 문자를 넣어야 합니다.

 

2차시도

def solution(n):
    answer = 0
    s = str(n)
    for i in s: 
        answer += int(i)
    return answer

 

다른사람 풀이

def sum_digit(number):
    '''number의 각 자릿수를 더해서 return하세요'''
    if number < 10:
        return number

    return number%10 + sum_digit(number//10)



# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : {}".format(sum_digit(123)));

3. 정수 num이 짝수일 경우 "Even"을 반환하고 홀수인 경우 "Odd"를 반환하는 함수, solution을 완성해주세요.

def evenOrOdd(num):
    #함수를 완성하세요
    if num%2:
        return "Odd"

    return "Even"

#아래는 테스트로 출력해 보기 위한 코드입니다.

4. 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

 

1차 시도

def solution(arr):
    answer = 0
    nums = 0
    for i in arr:
        nums += i
        answer = nums// lenth(arr)
    return answer

1. lenth(arr): 오타가 있습니다. lenth가 아니라 len이 맞습니다. len(arr)는 배열의 길이를 구하는 함수입니다.

2. answer = nums // len(arr): 현재 코드에서 answer를 계산하는 방식이 잘못되었습니다. //는 정수 나누기이기 때문에, 평균값을 계산할 때는 소수점이 있을 수 있습니다. 평균값을 계산할 때는 //가 아닌 /를 사용해야 합니다.

3. nums 변수 사용: nums는 총합을 계산하는 변수인데, 사실 answer에 평균을 저장하면 충분합니다. nums 변수는 불필요하게 보입니다.

 

2차시도

def solution(arr):
    answer = 0
    nums = 0
    for i in arr:
        nums += i
        answer = nums / len(arr)
    return answer

 

수정된 코드: 

def solution(arr):
    answer = sum(arr) / len(arr)  # 배열의 합을 배열의 길이로 나누어 평균 계산
    return answer

 

다른사람 코드: 

def average(list):
    # 함수를 완성해서 매개변수 list의 평균값을 return하도록 만들어 보세요.
    return sum(list) / len(list)

# 아래는 테스트로 출력해 보기 위한 코드입니다.
list = [5,3,4] 
print("평균값 : {}".format(average(list)));

 

 


5. 함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.

1차 시도

def solution(x, n):
    answer = []
    for i in n:
        num = x*i
        answer.append(num)
    return answer

TypeError: 'int' object is not iterable 

 주로 int 타입의 값에 대해 반복(iteration)하려고 할 때 발생합니다.

 

2차시도 

def solution(x, n):
    answer = []
    for i in range(1, n+1):
        num = x*i
        answer.append(num)
    return answer

 

다른사람풀이:

def number_generator(x, n):
    # 함수를 완성하세요
    return [i * x + x for i in range(n)]
print(number_generator(2, 5))

6. 자연수 n이 매개변수로 주어집니다. n x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.

 

1차시도 

def solution(n):
    for i in range(1,n,2): 
        print (i)
        return

이 코드에는 return이 반복문 안에 있어서 첫 번째 반복에서 바로 함수가 종료되는 문제가 있습니다. return은 함수가 실행을 끝내고 결과를 반환하는 역할을 하는데, 반복문 안에 두면 첫 번째 반복 후 바로 종료되어 나머지 값들이 출력되지 않습니다.

 

 

2차시도

def solution(n):
    for i in range(1,n,2): 
        if n % i == 1: 
            ans_list = []
            ans_list.append(i)
            answer = ans_list(min)
    return answer

코드 문제 분석:

1. ans_list = []: 리스트 ans_list를 반복문 안에 계속 초기화하고 있어서 반복할 때마다 이전 값들이 사라지게 됩니다. 이를 반복문 밖에 두어야 합니다.

2. ans_list.append(i): 이 부분은 i 값을 ans_list에 추가하려는 코드로 괜찮습니다.

3. ans_list(min): min을 함수처럼 사용하고 있는데, min() 함수를 사용하여 ans_list에서 최소값을 구해야 합니다. min() 함수는 리스트에서 가장 작은 값을 반환하는 함수입니다.

4. 조건: n % i == 1의 조건이 맞는지, 의도를 좀 더 명확히 할 필요가 있습니다.

 

3차시도

def solution(n):
    ans_list = []
    for i in range(1,n,2): 
        if n % 2 == 1: 
            ans_list.append(i)
        return answer = ans_list(min)
    return answer

수정된 코드:

def solution(n):
    ans_list = []  # ans_list는 반복문 밖에서 초기화
    for i in range(1, n, 2):  # 1부터 n까지 홀수만 반복
        if n % i == 1:  # n을 i로 나누었을 때 나머지가 1인 경우
            ans_list.append(i)  # 그 i 값을 리스트에 추가
    if ans_list:  # ans_list가 비어 있지 않으면
        return min(ans_list)  # ans_list에서 최소값을 반환
    return None  # 만약 ans_list가 비어 있으면 None을 반환