4 분 소요

코딩테스트 입문

약수 구하기

** 문제 설명 **

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 10,000

입출력 예

n result
24 [1, 2, 3, 4, 6, 8, 12, 24]
29 [1, 29]

입출력 예 설명

입출력 예 #1

  • 24의 약수를 오름차순으로 담은 배열 [1, 2, 3, 4, 6, 8, 12, 24]를 return합니다.

입출력 예 #2

  • 29의 약수를 오름차순으로 담은 배열 [1, 29]를 return합니다.

약수란??

어떤 수를 나누어 나머지가 없이 떨어지게 하는 수를 약수라고 합니다.


우선 n은 1부터 10000까지입니다.

def solution(n):
    a = 1 #낮은 수 부터 차례로 나머지가 없는 수를 찾기 위해서 1부터 시작
    answer =[] #답을 담기 위해서 빈 리스트 생성
    if n == 1:
        return [1]
    while a/2 < n/2:
        if n % a == 0:
            b = n//a
            if a not in answer:
                answer.append(a)
            if b not in answer:
                answer.append(b)
        a+= 1
    return sorted(answer)

다른 사람의 풀이

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

숫자 찾기

문제 설명

정수 numk가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 0 < num < 1,000,000
  • 0 ≤ k < 10
  • numk가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다.

입출력 예

num k result
29183 1 3
232443 4 4
123456 7 -1

입출력 예 설명

입출력 예 #1

  • 29183에서 1은 3번째에 있습니다.

입출력 예 #2

  • 232443에서 4는 4번째에 처음 등장합니다.

입출력 예 #3

  • 123456에 7은 없으므로 -1을 return 합니다.

num을 탐색하여 숫자 k가 있으면 그 자리 수를 return

없다면 -1을 return하는 문제

def solution(num, k):
    numList = list(map(int, str(num)))
    for i, v in enumerate(numList):
        if v == k:
            return i+1
    return -1     

다른 사람의 풀이

def solution(num, k):
    return -1 if str(k) not in str(num) else str(num).find(str(k)) + 1

한 번만 등장한 문자

문제 설명

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.


제한사항

  • 0 < s의 길이 < 1,000
  • s는 소문자로만 이루어져 있습니다.

입출력 예

s result
“abcabcadc” “d”
“abdc” “abcd”
“hello” “eho”

입출력 예 설명

입출력 예 #1

  • “abcabcadc”에서 하나만 등장하는 문자는 “d”입니다.

입출력 예 #2

  • “abdc”에서 모든 문자가 한 번씩 등장하므로 사전 순으로 정렬한 “abcd”를 return 합니다.

입출력 예 #3

  • “hello”에서 한 번씩 등장한 문자는 “heo”이고 이를 사전 순으로 정렬한 “eho”를 return 합니다.

문자열 s를 탐색해서 겹치는 수를 제거하여 겹치지 않는 수를 return

def solution(s):
    sList = set(list(s))
    answer =[]
    for i in  sList:
        if list(s).count(i) == 1:
            answer.append(i)
    return ''.join(sorted(answer))

여기서 그냥 list(s)로 반복문을 실행해도 되는데 안한것은 겹치는 문자열에 대해서 여러번하지 않아도 되기 때문입니다.

다른 사람의 풀이

def solution(s):
    answer = "".join(sorted([ ch for ch in s if s.count(ch) == 1]))
    return answer

문자열 계산하기

문제 설명

my_string은 “3 + 5”처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.


제한사항

  • 연산자는 +, -만 존재합니다.

  • 문자열의 시작과 끝에는 공백이 없습니다.

  • 0으로 시작하는 숫자는 주어지지 않습니다.

  • 잘못된 수식은 주어지지 않습니다.

  • 5 ≤ my_string의 길이 ≤ 100

  • my_string
    

    을 계산한 결과값은 1 이상 100,000 이하입니다.

    • my_string의 중간 계산 값은 -100,000 이상 100,000 이하입니다.
    • 계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.
    • my_string에는 연산자가 적어도 하나 포함되어 있습니다.
  • return type 은 정수형입니다.

  • my_string의 숫자와 연산자는 공백 하나로 구분되어 있습니다.

입출력 예

my_string result
“3 + 4” 7

입출력 예 설명

입출력 예 #1

  • 3 + 4 = 7을 return 합니다.

def solution(my_string):
    return eval(my_string)

다른 사람의 풀이

def solution(my_string):
    return sum(int(i) for i in my_string.replace(' - ', ' + -').split(' + '))

이 풀이는 문자열의 계산을 돕는 eval이 아닌 sum을 사용합니다.

그렇기 때문에 -가 연산으로 있기보다 수를 음수화 해서 더하는 알고리즘입니다.

spilt을 하면 해당 기준으로 나눠지는 list가 되는데 sum은 list의 수를 더합니다. 이런 특성을 가지고 풀이를 한 것 같습니다.

숨어있는 숫자의 덧셈(2)

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.
  • 문자열에 자연수가 없는 경우 0을 return 해주세요.

입출력 예

my_string result
“aAb1B2cC34oOp” 37
“1a2b3c4d123Z” 133

입출력 예 설명

입출력 예 #1

  • “aAb1B2cC34oOp”안의 자연수는 1, 2, 34 입니다. 따라서 1 + 2 + 34 = 37 을 return합니다.

입출력 예 #2

  • “1a2b3c4d123Z”안의 자연수는 1, 2, 3, 4, 123 입니다. 따라서 1 + 2 + 3 + 4 + 123 = 133 을 return합니다.

def solution(my_string):
    numStr = ""
    answer = []
    for i in my_string:
        if i.isdigit():
            numStr += i
        else:   
            if numStr != "":
                answer.append(int(numStr))
                numStr =""
    if numStr != "":            
        answer.append(int(numStr))
    return sum(answer)

우선 값을 문자열을 탐색하면서 숫자를 담을 곳과 담은 숫자를 계산할 리스트를 생성해줍니다.

반복문을 통해서 해당 문자열이 숫자인지 판단 후 숫자라면 numStr에 담아 줍니다.

다음 문자열로 문자가 나오고 numStr이 빈 문자열이 아니라면 담긴 수를 계산할 리스트에 담아줍니다.

여기 까지 하고 나온값을 sum 해주면 문제가 발생합니다.

image-20250104210830555

바로 해당 반복문에서 문자로 끝이난게 아닌 숫자로 끝난다면 마지막으로 담긴 수는 계산할 리스트에 담기지 않고 계산 되기 때문입니다. 예) "a1vb234"

그래서 최종으로 리스트를 계산하기 전 numStr에 수가 들어가 있는지 판단하고 있다면 더해주고 계산해줍니다.


다른 사람의 풀이

def solution(my_string):
    s = ''.join(i if i.isdigit() else ' ' for i in my_string)
    return sum(int(i) for i in s.split())

이렇게 간단하게 풀이한 방법도 있습니다.

문자열을 탐색하여 문자가 아니라면 공백, 숫자라면 숫자를 담는 문자열 s를 생성합니다.

` s = ‘‘.join(i if i.isdigit() else ‘ ‘ for i in my_string)`

"43as12e3"를 예시로 저 코드를 돌리보면 s = "43 12 3"과 같은 문자열이 생깁니다.

이를 공백을 기준으로 split하면 [43, 12, 3]이 되고 이를 sum을 이용해서 더해준다면 성공적으로 계산이 완료됩니다.

업데이트:

댓글남기기