행동 대장
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 하기,,