프로그래머스 코딩테스트 입문
밀린 것들 좀 쭉 풀었음. 하루 최소 3문제 였기 때문에 일,월,화 최소 9문제 풀 예정.
두 수의 곱
link : https://school.programmers.co.kr/learn/courses/30/lessons/120804
문제 설명
정수 num1, num2가 매개변수 주어집니다. num1과 num2를 곱한 값을 return 하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ num1 ≤ 100
- 0 ≤ num2 ≤ 100
입출력 예
num1 | num2 | result |
3 | 4 | 12 |
2 | 19 | 513 |
코드 제출 :
def solution(num1, num2):
return num1*num2
해설
곱한 값을 반환하면 되는 쉬운 문제.
파이썬의 기본 산술 연산자 * multiplication을 이용.
점수 : 1001 (+1)
두 수의 차
link : https://school.programmers.co.kr/learn/courses/30/lessons/120803
문제 설명
정수 num1과 num2가 주어질 때, num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.
제한사항
- -50000 ≤ num1 ≤ 50000
- -50000 ≤ num2 ≤ 50000
입출력 예
num1 | num2 | result |
2 | 3 | -1 |
100 | 2 | 98 |
코드 제출 :
def solution(num1, num2):
return num1 - num2
해설
동일하게 산술 연산자 subtraction 이용
점수 : 1002 (+1)
나이 출력
link : https://school.programmers.co.kr/learn/courses/30/lessons/120820
문제 설명
머쓱이는 40살인 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 나이 age가 주어질 때, 2022년을 기준 출생 연도를 return 하는 solution 함수를 완성해주세요.
제한사항
- 0 < age ≤ 120
- 나이는 태어난 연도에 1살이며 1년마다 1씩 증가합니다.
입출력 예
age | result |
40 | 1983 |
23 | 2000 |
코드 제출 :
def solution(age):
return 2022 - age + 1
해설
기준 년도에서 나이를 빼고 +1을 하면 나이가 나옴.
점수 : 1003 (+1)
나머지 구하기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120810
문제 설명
정수 num1, num2가 매개변수로 주어질 때, num1를 num2로 나눈 나머지를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 0 < num1 ≤ 100
- 0 < num2 ≤ 100
입출력 예
num1 | num2 | result |
3 | 2 | 1 |
10 | 5 | 0 |
코드 제출 :
def solution(num1, num2):
return num1 % num2
해설
파이썬의 산술 연산자 Arithmetic Operators 중에서 Modulus 나머지 연산자를 이용. %는 두 수를 나누었을 때 나머지만 구할 수 있고 몫은 버림 나눗셈(//, Floor Division)으로 구할 수 있다. 참고로 %는 모듈로(modulo) 연산자라고 한다.
점수 : 1004 (+1)
몫 구하기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120805
문제 설명
정수 num1, num2가 매개변수로 주어질 때, num1를 num2로 나눈 몫을 return 하도록 solution 함수를 완성해주세요.
제한사항
- 0 < num1 ≤ 100
- 0 < num2 ≤ 100
입출력 예
num1 | num2 | result |
10 | 5 | 2 |
7 | 2 | 3 |
코드 제출 :
def solution(num1, num2):
return num1 // num2
해설
파이썬의 산술 연산자 Arithmetic Operators 중에서 몫은 버림 나눗셈(//, Floor Division)으로 구할 수 있다.
점수 : 1006 (+2)
두 수의 합
link : https://school.programmers.co.kr/learn/courses/30/lessons/120802
문제 설명
정수 num1과 num2가 주어질 때, num1과 num2의 합을 return하도록 soltuion 함수를 완성해주세요.
제한사항
- -50000 ≤ num1 ≤ 50000
- -50000 ≤ num2 ≤ 50000
입출력 예
num1 | num2 | result |
2 | 3 | 5 |
100 | 2 | 102 |
코드 제출 :
def solution(num1, num2):
return num1 + num2
해설
동일하게 산술 연산자 Addition 이용. sum도 가능하겠지만 단순하게 빠른 것을 하고 싶어서 연산자 이용.
점수 : 1007 (+1)
두 수의 나눗셈
link : https://school.programmers.co.kr/learn/courses/30/lessons/120806
문제 설명
정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soultion 함수를 완성해주세요.
제한사항
- 0≤ num1 ≤ 100
- 0 ≤ num2 ≤ 100
입출력 예
num1 | num2 | result |
2 | 3 | 5 |
100 | 2 | 102 |
코드 제출 :
def solution(num1, num2):
return int((num1 / num2) * 1000)
해설
// Floor Division 이 아니라 / Division 으로서 나눈 값으로서 float 값이 나오게 하고 1000을 곱한 뒤 type casting을 int로 처리.
점수 : 1010 (+3)
숫자 비교하기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120807
문제 설명
정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 return 하도록 solution 함수를 완성해주세요.
제한사항
- 0≤ num1 ≤ 10,000
- 0 ≤ num2 ≤ 10,000
입출력 예
num1 | num2 | result |
2 | 3 | 5 |
100 | 2 | 102 |
코드 제출 :
def solution(num1, num2):
return 1 if num1 == num2 else -1
해설
1 if num1 is num2 else -1 을 쓰지 않은 이유. is 는 Identity Operators 식별 연산자로서 같은 Object오브젝트, 객체여야 한다. 같은 값 value를 가진 것이 아니라 객체가 다르다고 인지하므로 테스트에서 실패가 뜨기도 했다. 또한 문제에서는 수라는 값이 같다는 것을 전제로 했으므로 Comparison Operators 비교 연산자인 == equal 로서 if else condition을 삼항연산자
ref : https://www.w3schools.com/python/gloss_python_identity_operators.asp
ref : https://www.w3schools.com/python/gloss_python_comparison_operators.asp
ref : https://www.geeksforgeeks.org/ternary-operator-in-python/
점수 : 1011 (+1)
분수의 덧셈
link : https://school.programmers.co.kr/learn/courses/30/lessons/120808
문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 < denum1, num1, denum2, num2 < 1,000
입출력 예
denum1 | num1 | debum2 | num2 | result |
1 | 2 | 3 | 4 | [5,4] |
9 | 2 | 1 | 3 | [29,6] |
코드 제출 :
# 첫 시도
# ref : https://www.skillsugar.com/how-to-add-fractions-in-python
from fractions import Fraction
def solution(denum1, num1, denum2, num2):
result = str(Fraction(f'{str(denum1)}/{str(num1)}') + Fraction(f'{str(denum2)}/{str(num2)}')).split('/')
return [int(n) for n in result]
# 결과 : 정확성: 73.3
# 합계: 73.3 / 100.0
# 실패
# 두 번째 시도
# ref : https://docs.python.org/ko/3/library/fractions.html#fractions.Fraction
from fractions import Fraction
def solution(denum1, num1, denum2, num2):
result = Fraction(denum1,num1) + Fraction(denum2,num2)
answer = []
answer.append(int(result.numerator))
answer.append(int(result.denominator))
return answer
# 줄여서
from fractions import Fraction
def solution(denum1, num1, denum2, num2):
result = Fraction(denum1,num1) + Fraction(denum2,num2)
return [int(result.numerator), int(result.denominator)]
# 다른 방법
from math import gcd
# 최대공약수 Greatest Common Divisor aka GCD 의 성질을 이용
# https://docs.python.org/ko/3/library/math.html#math.gcd
def solution(denum1, num1, denum2, num2):
denum = denum1 * num2 + denum2 * num1
num = num1 * num2
# 분모의 합은 일반적으로 분모가 다를 때는 분수를 더하기 전에 분모의 최소공배수를 찾고, 분모를 같게 통분해야 한다. 고로, 1/2 + 3/5 일 때, 2와 5의 최소공배수는 10이다. 그리고 이를 분자에 공통되게 적용이 되도록 각자의 최소공배수가 되도록 곱을 해줘야 하고 그를 합한다.
# 분자는 1*5 + 3*2 = 5+6 = 11이 된다.
# 분모는 다르므로 곱한다 2*5
return [denum // gcd(denum, num), num // gcd(denum, num)]
# 그리고 최대 공약수를 구한 뒤에 각자의 분자와 분모로 나눈 값으로 반환.
해설
방법은 두 가지 였음. 하나는 수학적으로 접근하는 거랑 라이브러리 쓰기. 기억하는 바로는 분수도 라이브러리 있어서 그걸 쓰기로 함. 1. 빌트인 메서드 Built-in Method 로서 from fractions import Fraction 쓰기.
ref : https://www.skillsugar.com/how-to-add-fractions-in-python 이걸로 했는데 코드 실해에서는 테스트 성공인데 제출에서는 틀리길래 뭐가 문젠가 하다가 수학적인 오류보다는 문자열로 분리하고 처리하는 과정에서의 오류인 느낌이라서 두 번째는 라이브러리의 기능으로서 정수형의 분자(numerator)와 분모(denominator)라는 속성을 이용해서 정확하게 반환 시키니 맞았음. 2. 두번째는 수학적으로 풀이한 내용
ref : https://stackoverflow.com/questions/66549612/gcd-implementation-of-fraction-addition-not-working-properly 여길 참조함.
수학적 계산법은 https://ko.wikihow.com/%EB%B6%84%EB%AA%A8%EA%B0%80-%EB%8B%A4%EB%A5%B8-%EB%B6%84%EC%88%98-%EB%8D%A7%EC%85%88%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95 가 설명 잘 함.
점수 : 1022 (+11)
배열 두 배 만들기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120809
문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- -10,000≤ numbers의 원소 ≤ 10,000
- 1 ≤ numbers의 길이 ≤ 1,000
입출력 예
num1 | num2 | result |
2 | 3 | 5 |
100 | 2 | 102 |
코드 제출 :
def solution(numbers):
return [n*2 for n in numbers]
해설
리스트 컴프리헨션 List Comprehension을 이용해서 for loop 을 이용해 list 객체를 원하는 값을 적용하면서 반환하도록 처리
ref : https://wikidocs.net/22805
ref : https://www.geeksforgeeks.org/python-list-comprehension/
점수 : 1023 (+1)
각도기
link : https://school.programmers.co.kr/learn/courses/30/lessons/120829
문제 설명
각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.
- 예각 : 0 < angle < 90
- 직각 : angle = 90
- 둔각 : 90 < angle < 180
- 평각 : angle = 180
제한사항
- 0 < angle ≤ 180
- angle은 정수입니다.
입출력 예
angle | result |
70 | 1 |
91 | 3 |
180 | 4 |
코드 제출 :
def solution(angle):
if angle > 0 and angle < 90:
return 1
elif angle == 90:
return 2
elif angle > 90 and angle < 180:
return 3
elif angle == 180:
return 4
해설
단순하게 if condition으로 풀기는 했는데
수학적으로도 가능할 것 같아서 다른 사람 풀이 보고 새로운 방법 발견. 90 미만일 때는 //(Floor Division, 버림 나눗셈, 결과에서 소수점 이하는 버림)을 이용해서 0일 때를 이용하고, %(Modulus, 나머지) 가 0 이상일 때는 True로서 하여 1부터 시작하게 하고, 90일 때는 % 에서는 0이 나와서 False로 0이지만 그 전에 90 // 90을 하면 1이고 여기에 *2를 해서 직각일 때는 2번이고 이는 180일 때도 동일하게 된다.
180 // 90 해서 2 나온 것에 2를 곱하여 4가 되고, 180 % 90은 0이 되므로 4가 고대로 나옴.
그리고 90에서 180 사이는 91 // 90으로서 1이 나오므로 *2로서 2가 되고,
91 % 90의 경우도 1이라는 나머지에 *1을 하면 그대로 1이 나오므로 2+1해서 3이 됨. 각 조건에 따른 수학적인 고민이 보이는 좋은 경우였다고 생각함.
다른 사람들 풀이
# 다른 사람 풀이 : https://school.programmers.co.kr/learn/courses/30/lessons/120829/solution_groups?language=python3
def solution(angle):
answer = (angle // 90) * 2 + (angle % 90 > 0) * 1
return answer
점수 : 1025 (+2)
밀린 걸 하긴 했지만 꾸준히 해봐야겠다.
'스터디 > Python' 카테고리의 다른 글
[CodingTest][2022-12-17~24]프로그래머스 코딩테스트 입문 Part.1 (0) | 2022.12.16 |
---|---|
[CodingTest][2022-12-09~12]프로그래머스 코딩테스트 입문 문제들 (2) | 2022.12.16 |
[CodingTest][2022-12-08]프로그래머스 코딩테스트 입문 문제들 (0) | 2022.12.08 |
[CodingTest][2022-12-05]프로그래머스 스킬 테스트 Level 1 (0) | 2022.12.07 |
[CodingTest][2022-12-05]프로그래머스 스킬 테스트 Level 1 (0) | 2022.12.06 |