[코딩테스트 입문]5문제
코딩테스트 입문
약수 구하기
** 문제 설명 **
정수 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
숫자 찾기
문제 설명
정수 num
과 k
가 매개변수로 주어질 때, num
을 이루는 숫자 중에 k
가 있으면 num
의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 <
num
< 1,000,000 - 0 ≤
k
< 10 num
에k
가 여러 개 있으면 가장 처음 나타나는 자리를 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 해주면 문제가 발생합니다.
바로 해당 반복문에서 문자로 끝이난게 아닌 숫자로 끝난다면 마지막으로 담긴 수는 계산할 리스트에 담기지 않고 계산 되기 때문입니다.
예) "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을 이용해서 더해준다면 성공적으로 계산이 완료됩니다.
댓글남기기