일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- SQL쿼리
- 의대정원확장
- 의대확장
- 코딩테스트
- 토플공부법
- 영어신문읽기
- 의대정원
- 영어뉴스읽기
- 프로그래머스
- 영어
- 프로그래머스SQL
- 파이썬
- 프로그래머스코딩테스트
- 영어기사
- 영문법
- 영어기사읽기
- 코린이
- 파이썬코딩테스트
- 영어뉴스기사
- sql
- 파이썬코딩
- SQL코딩테스트
- 토플독학
- 영어신문
- 미국석사
- 영어표현
- 프로그래머스파이썬
- 토플준비
- 영어공부
- 영어뉴스
- Today
- Total
OFMY (Ony for me and you)
2일차: 프로그래머스 코딩 테스트 Python - Level 1 본문
1일차: 프로그래머스 코딩 테스트 Python - Level 1
1. 문제 설명문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.제한 조건s의 길이는 1 이상 5이하입니다.s의 맨앞에는 부호(+, -)가 올 수 있습니다.s는 부호와 숫자로만 이루어
bunnysideup.tistory.com
1. 문제 설명
자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.
1차 시도:
def solution(n):
ans_list = []
answer = 0
for i in range(1,n,2):
if i % 2 == 1 and n % i == 1:
ans_list.append(i)
#print(ans_list)
if ans_list: # ans_list가 비어 있지 않으면
answer = min(ans_list)
return answer
테스트 2개 실패
문제점 분석
1. 홀수만 검사하는 부분이 잘못됨 (for i in range(1, n, 2))
• 문제에서는 모든 자연수 x 중에서 n % x == 1을 만족하는 가장 작은 x를 찾아야 합니다.
• 하지만 range(1, n, 2)는 홀수만 탐색하므로, 짝수가 정답일 경우 찾을 수 없습니다.
• 예를 들어 n = 10이면, x = 3이 아닌 x = 2가 정답인데, 짝수를 검사하지 않아서 2를 놓칩니다.
2. i % 2 == 1 조건이 불필요
• range(1, n, 2)로 이미 홀수만 탐색하고 있으므로, i % 2 == 1 검사는 중복입니다.
3. 리스트를 사용할 필요가 없음
• 가장 작은 값만 찾으면 되므로 리스트를 만들고 min()을 사용할 필요가 없습니다.
• 가장 처음 발견한 값이 정답이므로, 즉시 반환하면 더 효율적입니다.
수정코드
def solution(n):
for i in range(1, n): # 1부터 n-1까지 모든 수 확인
if n % i == 1: # 나머지가 1이면
return i # 가장 작은 수 즉시 반환
2. 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
def solution(n):
n = str(n)
# 딕셔너리 생성 (키는 뒤집어진 인덱스, 값은 숫자)
n_dict = {len(n)-1 - i: int(digit)
for i, digit in enumerate(n)}
# 키에 맞게 값을 넣을 리스트 생성
result = [0] * len(n) # 리스트 크기는 숫자의 길이만큼
# 딕셔너리에서 키에 맞게 값 채우기
for key, value in n_dict.items():
result[key] = value
return result
설명:
1. n_dict는 키를 뒤집어서 만들었기 때문에 {4: 1, 3: 2, 2: 3, 1: 4, 0: 5}가 됐어.
2. result = [0] * len(n)으로 0으로 채워진 리스트를 만들었어. 리스트의 크기는 n의 길이만큼.
3. n_dict에서 key를 인덱스로 사용해 result[key]에 값을 넣었어.
4. 최종적으로 result 리스트에는 [5, 4, 3, 2, 1]이 들어가.
int 를 list 로?
1. n = 12345 n_list = list(map(int, str(n))) // [1, 2, 3, 4, 5]
2. [int(a) for a in str(12345)]
딕셔너리 컴프리헨션의 형식:
{key: value for item in iterable}
이 형식에서 **key와 value**는 for 반복문 안에서 계산되는 값이 됩니다.
예시로 설명:
n = "12345"
n_dict = {len(n) - 1 - i: int(digit) for i, digit in enumerate(n)}
1. 반복문:
• enumerate(n)을 통해 문자열 "12345"에 대해 (0, '1'), (1, '2'), (2, '3') 이런 식으로 각 인덱스와 문자가 i, digit으로 들어옵니다.
2. len(n) - 1 - i:
• 이 표현식은 뒤에서부터 key를 계산하는 거예요. len(n)은 5인데, 예를 들어 첫 번째 반복에서는 i가 0이므로, len(n) - 1 - i는 4가 됩니다. 두 번째 반복에서는 i가 1이므로 len(n) - 1 - 1이 되어 3이 됩니다. 이런 식으로 뒤에서부터 인덱스를 계산합니다.
3. int(digit):
• digit은 문자열에서 하나씩 가져오는 문자인데, 이를 정수형으로 변환한 값을 value로 설정합니다. 예를 들어 '1'은 1로 변환됩니다.
4. for i, digit in enumerate(n):
• 이제 이 for 반복문은 n 문자열의 각 문자에 대해 순차적으로 실행되며, 각 문자를 위의 계산식에 맞춰 key: value 형태로 n_dict에 담습니다.
다른사람풀이:
def digit_reverse(n):
# 함수를 완성해 주세요
a=[]
for i in str(n):
a.append(int(i))
a.reverse()
return a
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print("결과 : {}".format(digit_reverse(12345)));
2. 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
1차시도
def solution(a, b):
c = 0
if a == b:
return a
else:
if a>b: for i in range (a,b+1):
c += i
return c
else:for i in range (a,b+1):
c += i
return c
answer = a+b+c
return answer
들여쓰기 에러
return c는 안해줘도됨. 이미 answer에 a,b,c를 반환하니까
2차시도
def solution(a, b):
c = 0
if a == b:
return a
else:
if a>b:
for i in range (b,a+1):
c += i
else:
for i in range (a,b+1):
c += i
answer = c
return answer
다른사람 코드:
def adder(a, b):
if a > b:
a, b = b, a
return sum(range(a, b + 1))
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( adder(3, 5))
3. 대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
1차 시도
def solution(s):
answer = True
p_count = 0
y_count = 0
s_list = list(s)
for i in s_list:
if i = 'p' or 'P':
p_count += 1
elif i = 'y' or 'Y':
y_count += 1
return p_count, y_count
if p_count == y_count: return True
주된 문제는 if i = 'p' or 'P':와 같은 문법적 오류인데, 이 구문은 잘못된 방식입니다. 조건문에서 비교할 때는 ==을 사용해야 합니다.
수정된 코드
def solution(s):
p_count = 0
y_count = 0
# 문자열을 대소문자 구분 없이 처리하기 위해 모두 소문자로 변환
s = s.lower()
# 문자열에서 'p'와 'y'의 개수를 셈
for i in s:
if i == 'p':
p_count += 1
elif i == 'y':
y_count += 1
# 'p'와 'y'의 개수가 같으면 True, 다르면 False
return p_count == y_count
다른사람 코드
def numPY(s):
# 함수를 완성하세요
return s.lower().count('p') == s.lower().count('y')
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( numPY("pPoooyY") )
print( numPY("Pyy") )