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

 

Lv2 문제고, 스스로 푼 문제다!

처음에 문제를 읽었을 때는 그냥 직사각형의 가로,세로 길이를 구하는 건가? 싶어서 이것저것 삽질을 하다가 

자세히 읽어보니 갈색 영역은 세로에서 위아래, 가로에서 양옆에 한줄씩은 기본으로 차지해야한다는 것을 알았다 

따라서 기본으로 세로 길이가 3이상이 되어야한다

 

예제 3번을 보면 넓이가 48이고, yellow 영역이 24이다.  기본으로 48의 인수들을 구한 다음에 위의 조건을 만족해야하므로 (가로 - 2) * (세로 - 2) 가 yellow영역이 되는 가로, 세로를 찾은 다음 answer에 append한 결과를 반환하면 된다 

 

제발 문제좀 한번에 꼼꼼히 읽자!!!!!

 

- 정답 풀이 :

def solution(brown, yellow):
    area = brown + yellow
    heights = []
    #세로 후보들 result에 모으기 
    for i in range(3, area):
        if area % i == 0 :
            heights.append(i)      
    answer = []
    for height in heights:
        if (height - 2) * (area // height -2) == yellow:
            answer.append(area // height)
            answer.append(height)            
            break
            
    return answer

- 문제 : 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

 

+ Recent posts