문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.


입출력 예

n return
121  144
3 -1


입출력 예 설명
입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.

입출력 예#2
3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.

 

def solution(n):

    z = n**(1/2)
    if z.is_integer(): # 제곱근이 정수면 n도 정수
        answer = int((z+1)**2)
    else:
        answer = -1

    return answer

 

문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건
n은 1이상 8000000000 이하인 자연수입니다.


입출력 예

n return
118372 873211

 

def solution(n):

    numberlist = [int(i) for i in str(n)] # ex. ['1', '1', '8', '3', '7', '2']
    result = ''

    # max() 사용하기
    for i in range(len(numberlist)):
        result += str(max(numberlist)) # 현재 리스트에서 가장 큰 값 찾아 결과 문자열에 합치기
        numberlist.remove(max(numberlist)) # 윗줄에서 사용된 최댓값은 제거하고 새로운 리스트로 다시 for문 돌며 max찾기.

    return int(result)

 

>>> 참고!

sort를 사용했어야했는데 생각하지 못했던 것 같다.

다시 풀이한 코드는

def solution(n):

    return int(''.join(sorted(str(n),reverse=True))) # reverse=True해서 내림차순으로

문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

제한 조건
n은 10,000,000,000이하인 자연수입니다.


입출력 예

n return
12345  [5,4,3,2,1]

 

def solution(n):
    s = str(n) # 숫자를 문자열로
    re = list(reversed(s)) # 문자열 뒤집기
    return [int(i) for i in re] 
    
    # retrun [int(i) for i in list(reversed(str(n)))]

>>>참고

reversed가 기억안날땐 [::-1] 사용하여 뒤집기 (ex. s[::-1]

 

>>> map 활용했을때 정답 코드 (다른 사람 풀이 참고함)

def solution(n):
    return list(map(int, reversed(str(n))))

 

 

문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 사항
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.


입출력 예

s return
"try hello world" "TrY HeLlO WoRlD"

입출력 예 설명
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.

>>>참고!

'try hello     world'이렇게 입력 하면 'TrY HeLlO     WoRlD' 이렇게 띄어쓰기도 똑같은 횟수만큼 출력되어야함

 

def solution(s):

    # 단어를 기준으로 짝/홀 인덱스 판단해야하므로 공백 기준으로 단어 자름
    wordlist = s.split(' ') # split()으로 작성하면 공백은 제외되므로 구분자(' ') 넣어주기
    newlist = list()

    # 짝수 - 대문자 / 홀수 - 소문자로 변환
    for word in wordlist: # ex. word:try
        arr = []
        for i,chr in enumerate([i for i in word]): # ex. i:0/chr:'t' , i:1/chr:'r' , i:2/chr:'y'
            if(i%2==0):
                arr.append(chr.upper())
            else:
                arr.append(chr.lower())

        newlist.append(''.join(arr))

    return ' '.join(newlist) # 윗줄에서 split했을때 단어사이에 공백 한개씩 제외됨. 따라서 리턴에서 구분자에 띄어쓰기를 주어 join해줌

 

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

제한 사항
n은 0 이상 3000이하인 정수입니다.


입출력 예

n return
12 28
5 6


입출력 예 설명
- 입출력 예 #1
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.

- 입출력 예 #2
5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.

 

def solution(n):

    arr = list()
    # 1부터 n까지 나눠보고..
    for i in range(1,n+1):
        if n%i==0: # 나누어떨어지면 약수리스트에 삽입
            arr.append(i)

    return sum(arr)

>>> 리스트 컴프리헨션 사용하면 더 간단해짐

def solution(n):

    return sum([i for i in range(1,n+1) if n%i==0])

문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한 조건
공백은 아무리 밀어도 공백입니다.
s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
s의 길이는 8000이하입니다.
n은 1 이상, 25이하인 자연수입니다.


입출력 예

s n result
"AB" 1 "BC"
"z"  1 "a"
"a B z" 4 "e F d"

 

def solution(s, n):
    # 참고// 아스키코드 값 변환- ord()
    # s의 원소들을 모두 아스키 코드로 변환하고 n만큼 더한 값의 아스키코드를
    # 다시 문자로 변환(chr())

    # 문자열을 리스트로 변환
    arr = list()

    for i in s: # 문자열에서 원소 하나씩 꺼내가며 공백,소문자,대문자 판별하고 -> 암호화 방식대로 문자 바꿔줌
        # 공백일 때
        if i == ' ':
            arr.append(' ') # 공백은 밀어도 공백

        # 소문자일 때
        elif ord(i) in range(ord('a'), (ord('z') + 1)):
            if (ord(i) + n) > ord('z'): # ord(원소)에 n만큼 더한게 ord('z')보다 넘어갈때
                arr.append(chr(ord('a') + (n - (ord('z')-ord(i)) - 1))) # a의 아스키코드값에 z의 아스키코드에서 현재 원소의 아스키코드를 뺀값을 빼주고 -1해준다.
            else:
                arr.append(chr(ord(i) + n))

        # 대문자일때
        else:
            if (ord(i) + n) > ord('Z'):  # ord(원소)에 n만큼 더한게 ord('Z')보다 넘어갈때
                arr.append(chr(ord('A') + (n - (ord('Z')-ord(i)) - 1)))
            else:
                arr.append(chr(ord(i) + n))

    return ''.join(arr)

 

문제 설명
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

제한 조건
n은 길이 10,000이하인 자연수입니다.


입출력 예

n return
3 "수박수"
4 수박수박"

 

def solution(n):
    answer = ''
    for i in range(1,n+1):
        if(i%2!=0): # 홀수 자리엔 '수'
            answer+='수'
        else: # 짝수 자리엔 '박'
            answer += '박'
    return answer

문제 설명
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항
seoul은 길이 1 이상, 1000 이하인 배열입니다.
seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
"Kim"은 반드시 seoul 안에 포함되어 있습니다.


입출력 예

seoul  return
["Jane", "Kim"]  "김서방은 1에 있다"

 

def solution(seoul):

    num = -1
    for i in seoul:
        num += 1 # 해당 원소 인덱스 찾기 위해 for돌며 원소 가져올때마다 1씩 증가
        if(i=='Kim'):
            break

    return f'김서방은 {num}에 있다'

>>> 참고

다른 사람의 문제풀이를 보니 .index()를 활용하여 더 간단하게 풀 수 있었다.

ex. arr = ['a','b','cc','a']

arr.index('a') 

출력 : 0 

# 찾으려는 원소가 '처음' 등장하는 위치를 알려줌

+ Recent posts