본문 바로가기
스터디/Python

[CodingTest][2022-12-06]프로그래머스 코딩테스트 입문 문제들

by SeO.V 2022. 12. 6.

프로그래머스 코딩테스트 입문

밀린 것들 좀 쭉 풀었음. 하루 최소 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
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) 연산자라고 한다. 

ref : https://www.w3schools.com/python/python_operators.asp 

ref : https://dojang.io/mod/page/view.php?id=1229

점수 : 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)으로 구할 수 있다. 

ref : https://www.w3schools.com/python/python_operators.asp 

점수 : 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로 처리. 

ref : https://www.w3schools.com/python/python_casting.asp

 

점수 : 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)


밀린 걸 하긴 했지만 꾸준히 해봐야겠다.