카테고리 없음

[프로그래머스] 레벨 1 먼저 풀어보기 (2)

chaewot 2026. 4. 11. 22:02

행동대장

1. 뭔가.. 주어진 숫자만큼 값을 맞춰야되면 일단 정렬을 하자!, 뭔 소린지 모르겠으면 아래 7번 보셈


1. k번째 수

 

나의 풀이

def solution(array, commands):
    answer = []
    for i in commands:
        sort_array = []
        # 문제 1: append를 쓰면 [[5, 2, 6, 3]] 처럼 리스트 안에 리스트가 들어가요.
        sort_array.append(array[i[0]:i[1]]) 
        
        # 문제 2: 리스트 안에 리스트가 하나뿐이라 sort()를 해도 아무 변화가 없어요.
        sort_array.sort() 
        
        # 문제 3: i[2]는 '번째' 숫자인데 인덱스는 0부터 시작하므로 범위를 벗어날 수 있어요.
        answer.append(sort_array[i[2]]) 
            
    return answer
오답: 리스트를 새로 안 만들어도 됨. 그냥 변수 하나 선언하고 그 안에 리스트 넣으면 됨

 

새로운 풀이

def solution(array, commands):
    answer = []
    for i in commands:
        sort_array = array[i[0]-1:i[1]]
        sort_array.sort()
        answer.append(sort_array[i[2]-1])
            
    return answer
주의할 점: -1을 꼭 해줘야됨!!!! 리스트는 인덱스를 조심해..

 

다른 풀이

def solution(array, commands):
    answer = []
    for command in commands:
        i,j,k = command
        answer.append(list(sorted(array[i-1:j]))[k-1])
    return answer
command 안에 있는 값 하나씩 변수로 읽어올 수 있음..

2. 숫자 문자열과 영단어

 

풀이

def solution(s):
    data = {
        "zero" : 0,
        "one" : 1,
        "two" : 2,
        "three" : 3,
        "four" : 4,
        "five" : 5,
        "six" : 6,
        "seven" : 7,
        "eight" : 8,
        "nine" : 9
    }
    
    answer, string = '', ''
    
    for i in s:
        if i.isdigit():
            answer += str(i)
        else:
            string += i
            if (string in data) :
                answer += str(data[string])
                string=''
            
    return int(answer)
저렇게 하나하나씩 매칭?해주는 것을 '딕셔너리'라고 함!
쓸거면 왼쪽값으로 써줘야함 안 그러면 에러 ex)data[zero]

문자열에 숫자 더하는건 안 됨!!! 쓸거면 str로 형변환하고 써줘야함

 

replace 함수

text = "Hello World, Hello Python!"
new_text = text.replace("Hello", "Good", 1)
print(new_text)  # 출력: "Good World, Hello Python!"
Hello를 Good으로 1번 바꾼다, 세 번째 인자는 안 써도 됨. 안 쓰면 다 바뀜

 

다른 풀이

def solution(s):
    words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

    for i in range(len(words)):
        s = s.replace(words[i], str(i))

    return int(s)
어떻게 이런 생각을..

3. 푸드 파이트 대회

솔직히 어려워보이지만 1도 안 어려운 문제였음./.

 

풀이

def solution(food):
    answer = ""
        
    for i in range(1, len(food)):
        if food[i] % 2 == 0 or food[i] % 2 == 1:
            answer += str(i) * (food[i] // 2)
        elif food[i] == 1:
            continue;
            
    new_answer = answer + "0" + answer[::-1]
            
    return new_answer
ㅂㄹ 어렵진 않다.. 새롭게 알게 된 사실은 문자열에 [::-1]을 하면 뒤집어진다는 것!
[::숫자]가 간격이라서 마지막부터 1간격으로 계속 더해주면 됨

 


4. 문자열 내 마음대로 정렬하기

 

풀이

def solution(strings, n):
    s=[]
    answer = []
    strings.sort()
    
    for i in strings:
        s.append(i[n]) # ["u", "e", "a"]
    s.sort() # ["a", "e", "u"]
    
    # strings의 n번째가 s와 같다면 추가
    for i in s:
        for j in strings:
            if j[n] == i and j not in answer:
                answer.append(j)
    
    
    return answer
미리 strings를 정렬하기. 왜냐하면 같은 값이면 또 정렬하기 귀찮으니까.. 미리 정렬해놓기
s의 순서를 따라야하기 때문에 s를 위에 놓는다!

5. 추억 점수

 

문제

코딩테스트 연습 - 추억 점수 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

너무 길어서.. 대충 이거로..

 

풀이

def solution(name, yearning, photo):
    data=dict(zip(name, yearning)) # { "may" : 5, "kein" : 10 ... } 
    answer = []
    
    for i in photo:
        sum = 0
        for j in i:
            sum += data.get(j, 0)
        answer.append(sum)
        
    return answer
dict: 딕셔너리로 만들어 줌, 두 쌍을 넣으면 됨.. zip는 name과 yearning을 튜플로 묶은 것
data.get(j, 0): dict 함수로 key 값이 없으면 0을 반환

6. 같은 숫자는 싫어

 

문제

 

풀이

def solution(arr):
    new = []
    for i in arr:
        if len(new) == 0 or new[-1] != i:
            new.append(i)
        
    return new
연속된 것 중 하나 제거, 순서대로 순회 -> 바로 스택 사용하기
스택은 맨 끝의 원소가 어떠냐에 따라 뺄지 말지 정하기 때문에 s[-1]처럼 맨 끝 배열을 잘 사용하면 좋다

7. 예산

 

문제 너무 길어서 링크로 대체..

코딩테스트 연습 - 예산 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

def solution(d, budget):
    answer = 0
    moneysum = 0
    
    d.sort() # [1, 2, 3, 4, 5]
    for i in d:
        moneysum += i
        if moneysum > budget: # ex) 10 됨..
            break;
        else:
            answer += 1
        
    return answer
최소 숫자 기준을 맞추는 문제가 나오면 일단 정렬을 하

8. 최소공배수, 최대공약수

문제

 

풀이

def solution(n, m):
    minvalue=[]
    answer = []
    for i in range(1, min(n, m)+1):
        if n % i == 0 and m % i == 0:
            minvalue.append(i)
    answer.append(max(minvalue))
            
    answer.append(answer[0] * (n//answer[0]) * (m//answer[0]))
    return answer
min, max 함수를 잘 사용하자! 
최대공약수는 제일 작은 애가 될 수 있으니까 범위를 제일 작은 애로 정하고 돌아

유클리드 호제법..? 몰라용...


9. 삼총사

 

문제

 

나의 풀이

# 일단 두 수를 더하고 그 합이 배열에 포함돼있는지 확인하기

def solution(number):
    answer = 0
    two_sum = 0
    for i in range(len(number)-1):
        for j in range(i+1, len(number)):
            two_sum=(number[i] + number[j])
            if -(two_sum) in number:
                answer += 1
                
    return answer
나는 일단 두 수를 더하고 그 수의 음수값이 있는지 확인하고 있으면 +1을 해주는거였는데..
문제점이 내가 앞에서 이미 사용한 숫자?도 확인하기 때문에 카운트가 +1 된다.
그래서 중복계산이 돼서 수가 커지는 거였음..

 

정답

# 일단 두 수를 더하고 그 합이 배열에 포함돼있는지 확인하기

def solution(number):
    answer = 0
    two_sum = 0
    for i in range(len(number)-1):
        for j in range(i+1, len(number)):
            two_sum=(number[i] + number[j])
            target=-two_sum
            
            answer += number[j + 1:].count(target)
                
    return answer
내가 이미 사용한 앞 말고 뒤쪽 배열에서만 값이 있는지 확인해야함.
그래서 j 다음값부터 따져야하기 때문에 number[j + 1:]이라고 쓴 것임.
또 number[j+1:]가 '있다' 라고만 하면 안 됨. 왜냐하면 개수를 세는 것이기 때문에 count 함수를 써야함
만약에 [-1, -2, 0, 3, 3]이 있다고 하자 그럼 target은 3이 되는데 in을 쓰면 3이 있긴하니까 1만 더해짐.
하지만 count를 쓰면 개수를 나타내는 것이니까 2가 더해질 것임

 

다른 풀이

def solution(number):
    answer=0
    for i in range(len(number)):
        for j in range(i+1, len(number)):
            for k in range(j+1, len(number)):
                if number[i] + number[j] + number[k] == 0:
                    answer +=1
    return answer
그냥 완전 직관적인 풀이

 

다른 풀이

def solution (number) :
    from itertools import combinations
    cnt = 0
    for i in combinations(number,3) :
        if sum(i) == 0 :
            cnt += 1
    return cnt
combinations(배열, 뽑을 숫자)를 사용해서 합이 0이면 +1..
근데 쓸거면 from itertools import combinations 이거 선언해야 하는듯?

10. 가장 가까운 글자

계속 시도했지만 못 풀었다.. 그래서 일단 제미니의 힘을 빌림.. 근데 저 방법은 생각도 못한 것이긴 했다!

 

문제

 

풀이

def solution(s):
    answer = []
    last_seen = {}

    for i in range(len(s)):
        char = s[i]
        
        if char not in last_seen:
            answer.append(-1)
        else:
            answer.append(i - last_seen[char])
        last_seen[char] = i
            
    return answer
last_seen 이라는 이름의 '딕셔너리'를 선언한다.
왜 딕셔너리인가? -> 어떤 문자가 몇 번 인덱스에 있는지 딱 알려줘야 하기 때문에 배열로는 한계가 있다..!
그리고 같은 문자가 들어오면 최신 인덱스로 반환해야하는데 이걸 다시 배열을 돌면서 업데이트하기 힘들기때문에..