카테고리 없음

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

chaewot 2026. 4. 17. 22:46

행동 대장

1. 돌리기 or 비교 문제가 나오면 줄부터 세워보자!: sort()를 잘 쓰자..

2. 리스트 vs 딕셔너리


 

1. 시저 암호

 

알아야 할 개념

print(ord("A")) # 65 출력
print(chr(65)) # A 출력
ord: 문자 -> 아스키 코드로 변환
chr: 아스키 코드 -> 문자로 변환
A: 65 ~ Z: 90
a: 97 ~ z: 122

 

나의 풀이

def solution(s, n):
    answer = ''
    for i in s:
        if i == " ":
            answer += " "
            continue;
        else:
            f_change = ord(i) + n
            if 91 <= f_change <= 96 or 123 <= f_change <= 127:
                f_change = ord(i) + n - 26
        s_change = chr(f_change)
        answer += s_change
    return answer
뭐가 문제였냐면.. Z일 때 90 넘어가면 어쩌면 소문자로 변할 수 있다. 근데 저게 더 귀찮지 않냐

 

수정한 풀이

def solution(s, n):
    answer = ''
    for i in s:
        if i == " ":
            answer += " "
            continue;
        else: # Z:90
            f_change = ord(i) + n
            if i.isupper():
                if f_change > 90:
                    f_change = ord(i) + n - 26
            elif i.islower():
                if f_change > 122:
                    f_change = ord(i) + n - 26
            s_change = chr(f_change)
            answer += s_change
    return answer
대문자인 경우, 소문자인 경우 두 개로 나눠주고 시작하였다.

2. 지폐 접기

 

문제 너무 길다..

코딩테스트 연습 - [PCCE 기출문제] 9번 / 지폐 접기 | 프로그래머스 스쿨

 

프로그래머스

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

programmers.co.kr

 

이전 풀이

def solution(wallet, bill):
    answer = 0
    while bill[0] > wallet[0] or bill[1] > wallet[1]:
        if bill[0] > wallet[0] and bill[1] > wallet[1]:
            bill[0] //= 2
            answer+=1
            bill[1] //= 2
            answer += 1
        elif bill[0] > wallet[0]:
            bill[0] //= 2
            answer += 1
        elif bill[1] > wallet[1]:
            bill[1] //= 2
            answer += 1
    return answer
# 50 120 1
# 50 60 2
# 50 30
문제 기준이 항상 길이가 긴 쪽을 반으로 접으라했는데 나는 그런거 상관없이 다 접게함..
그래서 횟수가 부족할수밖에 없었음. 물론 저게 통과 뜨긴했지만 긴 쪽으로 접는 조건에 부합하지 않았음

 

새로운 풀이

def solution(wallet, bill):
    answer = 0
    wallet.sort() # [15, 30]
    
    while True:
        bill.sort() # [17, 26] -> [13, 17]
        
        if bill[0] <= wallet[0] and bill[1] <= wallet[1]:
            break;
            
        bill[1] //= 2
        answer += 1
    return answer
항상 긴 쪽을 접으라고 했으니까 sort()를 써서 긴 쪽이 두 번째 인덱스에 계속 고정되도록 하는게 좋음..

3. 과일 장수

문제

 

나의 풀이

def solution(k, m, score):
    answer = 0
    score.sort(reverse=True)
    middle = [] # 3 3 2 2 1 1, m=4

    for i in range(0, len(score), m):
        if i+m > len(score):
            break;
        answer += min(score[i:i+m]) * m

    return answer
먼저 내림차순으로 정렬하고 i 인덱스에 m 더한 값이 배열 길이보다 길면 멈춘다
헷갈린 개념이 여기서 나오는데
score[i:i+m]은 i부터 i+m까지의 배열을 모두 가져오는 것이고, score[i::m]은 i부터 m만큼 떨어진 값들을 모두 가져오는 것이다
예를 들어 1, 1, 2, 2, 3, 3, 4, 4 배열이 있다고 가정하자.
0:3인 경우는 1, 1, 2를 가져오지만 0::3은 1, 2, 4만 가져온다.
그 중에서 최소값을 곱하면 된다

 

다른 풀이

def solution(k, m, score):
    answer = 0
    score.sort(reverse=True)

    for i in range(m-1, len(score), m):
        answer += score[i] * m

    return answer
인덱스 시작 범위를 m-1로 잡으면 딱 m-1 값만 가져오기 때문

4. 소수 찾기

풀이

import math

def solution(n):
    answer = 0
    for i in range(2, n+1):
        prime = True
        for j in range(2, int(math.sqrt(i))+1):
            if i % j == 0:
                prime = False
                break
        if prime == True:
            answer += 1
    return answer

걍 봐라. 설명하기도 귀찮다.. 

하나 개념은 math.sqrt는 float 값으로 나온다는 것. sqrt는 math를 import해야한다는 것..


5. 피보나치의 수

# F(0)=0, F(1)=1
# F(2)=F(0)+F(1)=0+1
# F(3)=F(1)+F(2)=1+(0+1)
# F(4)=F(2)+F(3)=(0+1)+(1+0+1)
# F(n+2) = F(n) - F(n-1)

def solution(n):
    a, b = 0, 1 #F(0), F(1)
    for i in range(n): 
        a, b = b, a+b
        # a=F(1), b=F(2)
        # a=F(2), b=F(3)

    return (a) % 1234567
그냥 계속 swap 하기,,