itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 킨디
  • ios
  • nosql
  • CS
  • POSTECH
  • 세그멘테이션
  • SWIFT
  • SwiftUI
  • 개발자
  • 독립서점
  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • 생활코딩
  • 연결리스트
  • CoreData
  • 점주
  • binding
  • 어플
  • mongodb
  • crud
  • AppleDevloperAcademy

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

PS

2주차 [ 프로그래머스 - 약수의 합, 직사각형 별 찍기, 이상한 문자 만들기 ] - range, for문+if문, map, \n

2021. 7. 7. 19:44

약수의 합

정수 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
    'PS' 카테고리의 다른 글
    • 5주차 [프로그래머스-폰켓몬] set 함수
    • 5주차 [프로그래머스 - 약수의 개수와 덧셈]
    • 4주차 [ 백준 - 셀프 넘버, 한수 ] - not in list
    • 2주차 [ 프로그래머스 - 자릿수 더하기 , 정수 제곱근 판별 ] - for문, list sum, math.sqrt, pow(x,y)
    itisjustK
    itisjustK

    티스토리툴바