- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

Level 1문제이고, 스스로 푼 문제다!

맨 아래있는 풀이로 처음에 작성했으나 61.5%에서 틀리길래 왜 그런지 생각해봤다

문제에 의하면 소문자는 소문자로 이동하고, 대문자는 대문자로 이동해야하는데 

대문자의 아스키 코드는 65 ~ 90 

소문자의 아스키 코드는 97 ~ 122

 

대문자에 n(1 ~ 25)을 더한 값의 범위는 66 ~ 115 이다. 이때 97 ~ 115인 경우는 소문자의 영역이므로 문자의 order값에 n을 더한 값이

97 ~ 115라면 이게 소문자에서 시작한 건지, 대문자에서 시작한건지 모호하다 

 

소문자인 경우와 대문자인 경우로 나누어서 진행하고 n을 더한값이 해당 문자의 끝을 넘어간다면 n을 더한 order 값에서 26을 빼주는 로직으로 하면 정답이 뜬다  

 

- 정답 풀이 :

def solution(s, n):  
    s = list(s)
    answer = ''
    for i in range(len(s)):   
        if 65 <= ord(s[i]) <= 90:
            num = ord(s[i]) + n 
            if 65 <= num <= 90:
                s[i] = chr(num)
            elif num > 90:
                s[i] = chr(num - 26)            
        elif 97 <= ord(s[i]) <= 122:
            num = ord(s[i]) + n
            if 97 <= num <= 122:
                s[i] = chr(num)
            elif num > 122 :
                s[i] = chr(num - 26)
                
    for i in range(len(s)):
    	answer += s[i]
    
    return answer

 

- 시도해본 풀이 

이렇게 풀면 안된다!

def solution(s, n):  
    s = list(s)
    answer = ''
            
        #이동한게 'A'부터 'Z' 사이 
        if 65 <= ord(s[i]) + n <= 90:
            s[i] = chr(ord(s[i]) + n)     
         #'a'이상 문자가 이동한게 'a'부터 'z'사이 
        elif 97 <= ord(s[i]) + n <= 122 :
            s[i] = chr(ord(s[i]) + n)
        #이동한게 'Z'를 벗어남 
        elif 90 < ord(s[i]) + n < 116 :
            s[i] = chr(ord(s[i]) + n - 26) 
        #'z'보다 큰 경우 
        elif 122 < ord(s[i]) + n :
            s[i] = chr(ord(s[i]) + n - 26)

    for i in range(len(s)):
        answer += s[i]
    
    return answer

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

Level1 이고, 스스로 푼 문제다!

주어진 배열에서 임의의 두개의 수를 뽑아 리스트로 만든다음, 그 리스트의 합이 answer에 없다면 넣고, 있다면 넣지 않는다 

combinations 작성 방법과 이를 이용하려면 itertools 모듈을 import 해야하는 것 헤매지 않고 잘 사용했다 

 

- 정답 풀이 : 

import itertools 

def solution(numbers):
    
    temp = itertools.combinations(numbers, 2)
    
    answer = []
    for arr in temp:
        if sum(arr) not in answer:
            answer.append(sum(arr))

    answer.sort()
    
    return answer

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/12982

 

Level 1 문제이고, 스스로 푼 문제다!

최대한 많은 수를 더해야 하므로 작은 수 부터 더해야한다고 생각했다 

d.sort()를 한 뒤 0인덱스부터 더해가면 최대의 부서에세 물품을 지원할 수 있다 

count 변수로 그동안의 합을 누적한 뒤 이게 budget 이하인 경우에만 진행하고, 진행할 때마다 answer += 1 로 

갯수를 누적해간다 

 

- 정답 풀이 : 

def solution(d, budget):    
    d.sort()
    
    count = 0
    answer = 0 
    for i in d :
        if count + i < budget:
            count += i 
            answer += 1
        elif count + i == budget:
            answer += 1
            break
        else:
            break
            
    return answer

 

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/68935

 

Level 1 문제이고, 스스로 푼 문제다!

 

문제에서 헷갈렸던 게, 3진법 진행 순서와 배열의 진행 순서가 반대라는 것이다. 

배열에서는 가장 왼쪽이 0 인덱스지만, 3진법에서는 가장 오른쪽에 있는 수는 3 ** 0 을 곱해야하기 때문이다

 

1. 

몇 번까지 진행해야하는지 모르니까 while문으로 n을 나눌 수 있는 가장 큰 3의 제곱수를 찾은 다음 

거꾸로 for문을 진행하면서 n의 3진법을 three 리스트에 구현한다 

 

2. 

three 배열을 거꾸로 진행하면서 flipped 배열에 추가한다 (.sort(reverse = True) 는 1200 을 0021이 아닌 2100으로 바꿔서 안된다)

 

3. 

flipped의 원소들 또한 거꾸로 진행하면서 3의 제곱수를 곱해서 다 더한 값을 answer로 반환한다 

 

일일이 순서대로 진행했는데, 뭔가 큐나 스택의 특성을 이용하면 더 빨리 풀 수 있을 것 같다 

 

- 정답 풀이 :

def solution(n):
    answer = 0 
    mul= 0 
    while True:
        if n // (3 ** mul) == 0:
            mul -= 1 
            break
        mul += 1
    three = []
    
    for i in range(mul, -1 , -1):
        num = n // (3 ** i)
        three.append(num)
        # 제곱수의 몫까지 곱해서 빼주기 
        n -= (3 ** i) * num
        
    flipped = []
    for i in range(len(three) - 1, -1, -1):
        flipped.append(three[i])
    
    for i in range(len(three) - 1, -1, -1) :
        answer += flipped[i] * (3 ** (len(three) -1 - i))
    
    return answer

+ Recent posts