약수의 합
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
*제한 사항
n은 0 이상 3000이하인 정수입니다.
<내 풀이>
def solution(n):
sum_=0
i=1
while i <=n:
if n%i==0:
sum_=sum_+i
i+=1
else:
i+=1
return sum_
약수는 1과 정수 n 사이의 숫자로 n을 나누었을 때 나누어 떨어지는 수이므로, while문을 이용하여 i가 1부터 시작하여 n까지 1씩 증가하면서 나머지가 0이면 sum_에 더해주는 방식을 이용했다.
<다른 사람 풀이>
def sumDivisor(num):
return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])
내 풀이와의 차이점은 return 줄에서 한 번에 ①range를 이용하고, ②for문과 if문을 합쳐서 사용하였고, 이를 리스트에 담아서 sum을 이용하여 합을 구했다는 점이다. 또한 정수의 약수는 그 정수를 반으로 나눈 것 이하의 값만 나온다는 점을 이용하였다.
검사범위를 반으로 줄인다는 것은 대단한 효율을 의미한다. 항상 코드를 짤 때 극단의 상황을 가정하여야 한다. 만약 정수가 1,000,000,000처럼 큰 숫자가 나온다면 내 코드와 다른 사람 코드를 비교했을 때 엄청난 효율성을 보인다.
항상 코드를 짤 때 극단적인 상황을 생각하고 효율적인 코드를 생각해내자.
①range
range(start,stop,step) : start는 범위가 시작되는 수. stop은 범위가 멈추는 수. step은 숫자의 간격
i in range(start,stop) : start ≤ i < stop (stop은 포함되지 않는다.)
range(stop) : 0~stop
ex)
range(1,10) : 1,2,3,4,5,6,7,8,9
range(10) : 0,1,2,3,4,5,6,7,8,9
range(1,11,2) : 1,3,5,7,9
range(11,1,-2) : 11,9,7,5,3
②for문과 if문을 한 줄에 사용
for문과 If문을 한 줄에 사용하여 리스트 형식으로 출력할 수 있다.
[i for i in range(1,10) if i%2==0]
#[2,4,6,8]
직사각형 별 찍기
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
*제한 조건
n과 m은 각각 1000 이하인 자연수입니다.
<내 풀이>
a,b=input().split()
for i in range(int(b)):
print('*'*int(a))
가로와 세로로 출력하는 방식을 구분하는 것이 포인트다. 가로로 출력하는 것은 그 길이만큼 '*'을 a번 반복해주었다.
세로는 print를 그 길이만큼 해주면 되기에 for문을 이용하여 b번 반복해주었다.
<다른 사람 풀이>
a, b = map(int, input().split(''))
print(("*" * a + "\n") * b)
여기서는 ①map과 ②\n을 사용하였다. (단, 마지막 줄에 공백 줄이 포함된다.)
①map
map은 값을 한꺼번에 다른 형태로 변환하는 데에 쓰인다.
map(int, input().split()) : input으로 받은 것을 int 값으로 변환한다.
②\n
print할 때 줄바꿈을 의미
이상한 문자 만들기
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
*제한 사항
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
<내 풀이> 오답
def solution(sentence):
word_list=sentence.split() #단어 하나씩 리스트에 담음 #split해서 쪼개니까 알아서 리스트 형식으로 담겼음!
sl=int(len(word_list)) #단어의 개수
answer_=[] #대문자 처리가 완료된 단어들이 담길 리스트
for i in range(sl):
word = str(word_list[i]) #for문으로 단어 하나씩 지정
wl=int(len(word)) #단어 길이
new_word = []
for k in range(wl): #for문으로 단어 속 글자 하나씩 지정
if k%2==0:
new_word.append(str(word[k].upper())) #new_word 리스트에 한 글자씩 추가
else :
new_word.append(str(word[k].lower()))
answer_.append(str("".join(new_word))) #리스트에 있는 거 str로 출력하고 리스트에 담기 #들여쓰기 맞나?
#answer를 리스트로 저장하자. 각 단어들 대문자 처리한거 완료된거를 리스트로 담자
answer= " ".join(answer_)
return answer
지금까지 풀어왔던 문제들에 비해 확실히 복잡했다. 그래서 처음에 어떻게 풀어야하는지 막막해서 노트에 한 단계씩 적어가며 풀었다. 특히 처음에 헷갈렸던 부분은 내가 안배운 것을 이용해야 해서 내가 막막한건지, 아님 내가 배운 것을 활용해서 풀 수 있는데 복잡해서 못 풀고 있는 건지를 판단하는 것이 힘들었다. 한번만에 풀지는 못했고, 이틀에 걸쳐 계속 생각하고 내가 모르는 개념을 구글링하면서 답을 적긴 했지만 프로그래머스에 답 제출하니 오답이라고 뜬다. 맞는 케이스도 있고 틀린 케이스도 있다는데 틀린 케이스가 어디서 나오는지 모르겠다.
vs code의 terminal 창에서는 맞다고 나오는데 뭐가 문제인지 .. 이 답을 어떻게하면 쉽게 풀어낼 수 있는지 다른 사람들 답안을 보고싶지만 확실히 풀고 넘어가고 싶어서 내일까지 더 생각해보고 진짜 안되겠으면 봐야겠다.
<내 풀이> 정답
def solution(sentence):
word_list=sentence.split(' ') #단어 하나씩 리스트에 담음 #split해서 쪼개니까 알아서 리스트 형식으로 담겼음!
sl=int(len(word_list)) #단어의 개수
answer_=[] #대문자 처리가 완료된 단어들이 담길 리스트
for i in range(sl):
word = str(word_list[i]) #for문으로 단어 하나씩 지정
wl=int(len(word)) #단어 길이
new_word = []
for k in range(wl): #for문으로 단어 속 글자 하나씩 지정
if k%2==0:
new_word.append(str(word[k].upper())) #new_word 리스트에 한 글자씩 추가
else :
new_word.append(str(word[k].lower()))
answer_.append(str("".join(new_word))) #리스트에 있는 거 str로 출력하고 리스트에 담기 #들여쓰기 맞나?
#answer를 리스트로 저장하자. 각 단어들 대문자 처리한거 완료된거를 리스트로 담자
answer= " ".join(answer_)
return answer
오답과 정답의 차이는 바로 2번째 줄에 split(' ')이냐 split()이냐 의 차이였다. (뭔가 .. 꼬롬해서 저렇게 해봤는데 정답이었다)
split(' ')와 split()의 차이
k=" hello world "
a=k.split(' ')
b=k.split()
a=['','hello','','world','']
b=['hello','world']
'PS' 카테고리의 다른 글
5주차 [프로그래머스 - 숫자 문자열과 영단어] dictionary (0) | 2021.07.23 |
---|---|
5주차 [프로그래머스-폰켓몬] set 함수 (0) | 2021.07.23 |
5주차 [프로그래머스 - 약수의 개수와 덧셈] (0) | 2021.07.22 |
4주차 [ 백준 - 셀프 넘버, 한수 ] - not in list (0) | 2021.07.13 |
2주차 [ 프로그래머스 - 자릿수 더하기 , 정수 제곱근 판별 ] - for문, list sum, math.sqrt, pow(x,y) (0) | 2021.07.06 |