Python

[실무]프로그래머스 Python3 코딩테스트 입문(31~60문제)

노력하는 백곰 2024. 8. 7. 09:12

■ 출처

- 코딩테스트 : Python3 / 코딩테스트 입문 / 모든 상태 체크 / 31~60문제

https://school.programmers.co.kr/learn/challenges?order=recent&statuses=unsolved%2Csolving%2Csolved%2Csolved_with_unlock&languages=python3&partIds=33882&page=1

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

 

■ 연습문제

31. A로 B 만들기

#두 매개변수가 동일한지 확인하는 문제이므로 정렬함수 활용
def solution(before, after):
    """answer = ''
    for i in range(len(before)-1, -1, -1):
        answer += before[i]
    if answer == after:
        return 1
    else:
        return 0"""
    
    return 1 if sorted(before) == sorted(after) else 0

 


32. 이진수 더하기

bin() : 2진수로 변환하는 함수
oct() : 8진수로 변환하는 함수
hex() : 16진수로 변환하는 함수
int() : 10진수로 변환하는 함수(단, 두 번째 인자에 첫번째 인자의 진수 형태 입력)
- 예시, 2진수 값을 10진수로 변환시킬 때 'int('0b111100', 2)' 

def solution(bin1, bin2):
    answer = ''
    bin1 = int(bin1, 2)
    bin2 = int(bin2, 2)
    answer = bin(bin1 + bin2)
    return answer[2:]

 


33. 치킨 쿠폰

나누셈 연산자 구분 : ①'/'은 기본적인 나눗셈, ②'//'은 나눗셈의 몫, ③%은 나눗셈의 나머지

def solution(chicken):
    service = 0
    coup = chicken
    while coup >= 10:
        service += coup // 10
        coup = coup % 10 + coup // 10
    return service

 

 

34. 로그인 성공?

def solution(id_pw, db):
    answer = "fail"
    for i in db:
        if i[0] == id_pw[0]:
            if i[1] == id_pw[1]:
                answer = "login"
            else:
                answer = "wrong pw"
    return answer

 

 

35. 등수 매기기

def solution(score):
    answer = []
    for i in range(0, len(score)):
        answer.append((score[i][0]+score[i][1])/2)
    #높은 점수 순으로 정렬(내림차순) 
    sorted_answer = sorted(answer, reverse = True)
    #영어/수학 평균점수를 정렬된 평균점수를 기준으로 원본평균점수를 랭킹화
    rank_answer = [sorted_answer.index(j) + 1 for j in answer]
    return rank_answer

 

 

36. 특이한 정렬

sorted() 함수 : 오른차순으로 값을 정렬하는 함수
- reverse = True : 기존 오름차순 정렬을 reverse(즉, 내림차순 정렬)
- key = abs : 절대값을 기준으로 정렬
- key = len : 길이를 기준으로 정렬
- key= lambda x : (len(x), x) : 길이를 기준으로 정렬하고, 오른차순 정렬
- key = lambda x : (abs(x), -x) : 절대값을 적용한 순자순으로 정렬하고, 절대값이 같으면 양수 먼저 반환

def solution(numlist, n):
    #numlist 요소별 n과의 거리 측정 값 리스트
    answer = [] 
    for i in numlist:
        answer.append(i-n)
        
    #거리가 n에 가까운 순서대로 정렬 / 절대값이 같으면 양수 먼저 반환(즉, 큰값부터...)
    result = [] 
    for i in sorted(answer[:], key = lambda x : (abs(x), -x)): 
        result.append(numlist[answer.index(i)])
    return result

 

 

37. 유한소수 판별하기

최대공약수를 구하는 함수
- 공약수(Common Divisor)란, 두 수 이상의 여러 수의 공통된 약수를 의미)
- 최대공약수(GCD)란, 두 수 이상의 여러 수의 공약 수 중에서 최대인 수를 의미(최대공약수가 1이면 두 수는 서로소 관계)
- 예시, 
   from math import gcd
   math.gcd()

from math import gcd

def solution(a, b):
    b = b/gcd(a,b)
    
    while b%2 == 0:
        b = b/2
    while b%5 == 0:
        b = b/5
    return 1 if b == 1 else 2

 

 

38. 겹치는 선분의 길이

#전체 카운트 프레임에 세 선분에 해당하는 값을 카운트하여 2개 이상 중복된 부분의 길이를 계산
def solution(lines):
    answer = 0
    count = [0 for _ in range(200)] #-100부터 100까지 범위에서 선분이 그어질 횟수 카운트 프레임
    
    #중앙값(100+n)에서 세 선분의 값을 불러와서 카운트
    for line in lines:
        for i in range(line[0], line[1]): 
            count[i + 100] += 1
    
    #2, 3개 이상 겹치는 점
    answer += count.count(2)
    answer += count.count(3)
    return answer

 

 

39. 평행

def gdient(a, b): # 기울기 값 계산
    return (a[0] - b[0]) / (a[1] - b[1])

def solution(dots):
    p1, p2, p3, p4 = dots[:]
  
    if (gdient(p3,p1)==gdient(p4,p2)) or (gdient(p4,p3)==gdient(p2,p1)) or (gdient(p3,p2)==gdient(p1,p4)):
        return 1
    else:
        return 0

 

 

40. 저주의 숫자 3

def solution(n):
    answer = 0
    for _ in range(0, n):
        answer += 1
        while (answer % 3 == 0) or ('3' in str(answer)):
            answer += 1
    return answer

 

 

41. 외계어 사전

set() 함수를 통한 집합데이터 활용
- 교집합: 두 집합이 공통으로 포함하는 원소로 이루어진 집합을 의미
- 합집합: 두 집합에 속하는 모든 원소를 모우둔 집합을 의미
- 차집합: A집합에 속하지만 B집합에 속하지 않는 원소로 이루어진 집합을 의미
- 대칭 차집합: A집합과 B집합간 서로 속하지 않은 원소로 이루어진 대칭잡합을 의미
-예시, 
   set1 = set([1,2,3,4,5,6])
   set2 = set([3,4,5,6,8,9])

   print(set1 & set2)     #교집합
   print(set1.intersection(set2))     #교집합
   print(set1 | set2)     #합집합
   print(set1.union(set2))     #합집합
   print(set1 - set2)     #차집합
   print(set1.difference(set2))     #차집합
   print(set1 ^ set2)     #대칭차집합

#spell에서 dic[i]값을 set()함수를 활용한 차집함으로 빼서 아무것도없다는 의미는 spell값이 존재한다는 의미
def solution(spell, dic):
    for i in dic:
        if not set(spell) - set(i): 
            return 1
    return 2

 


42. 삼각형의 완성조건 (2)

def solution(sides):
    answer = 0
    max_side = max(sides)
    min_side = min(sides)
    
    #기존 sides 매개변수가 가장 길 경우
    for new_side in range (max_side-min_side+1, max_side+1):
        answer += 1
    
    #새로운 sides 매개변수가 가장 길 경우
    for new_side in range (max_side+1, max_side+min_side):
        answer += 1
    
    return answer

 

 

43. 안전지대

def solution(board):
    N = len(board)
    #지뢰를 기준으로 주변 위험지역 프레임을 dx, dy로 정의
    dx = [-1, 1, 0, 0, -1, -1, 1, 1] 
    dy = [0, 0, -1, 1, -1, 1, -1, 1]
    
    #지뢰 인덱스 확인
    boom = []
    for i in range(0, len(board)):
        for j in range(0, len(board)):
            if board[i][j] == 1:
                boom.append((i,j))
    
    #지뢰가 설치된 주변의 위험지역 확인
    for x, y in boom:
        for i in range(8):
            nx = x + dx[i]
            ny = y + dy[i]
            #지뢰가 한쪽 벽에 붙어버리면 위험지역 수가 줄기때문에 if조건물 활용
            if (0 <= nx < N) and (0 <= ny < N):
                board[nx][ny] = 1
    
    #지뢰/위험지역을 제외한 안전지역 카운트
    count = 0
    for x in range(N):
        for y in range(N):
            if board[x][y] == 0:
                count += 1
    return count

 

 

44. 숨어있는 숫자의 덧셈 (2)

findall() 함수 : 정규식과 매치되는 모든 문자열을 리스트형식으로 리턴
- 예시, 
   re.findall(r'\d+', my_string) : 숫자와 매치 / [0-9]와 동일한 표현식
   re.findall(r'\D+', my_string) : 숫자가 아닌 것과 매치 / [^0-9]와 동일한 표현식

 

.isalpha() 함수 : 알파벳인지 확인하는 함수
.isdigit() 함수 : 숫자인지 확인하는 함수
- 예시, 
   b = '1234'
   c = "qwer"
   print(b.isdigit())    #True`
   print(c.isalpha())  #True

#re라이브러리 기반 정규표현식 활용방법
import re
def solution(my_string):
    answer = 0
    num = re.findall(r'\d+', my_string)
    for i in num:
        answer += int(i)
    return answer

#isalpha()함수 활용방법
"""def solution(my_string):
    for i in my_string:
        if i.isalpha():
            my_string = my_string.replace(i, ' ')
    my_string = my_string.split()
    return sum(list(map(int, my_string)))"""

 

 

45. 다항식 더하기

def solution(polynomial):
    answer = ''
    num = 0   #x의 개수
    sum = 0   #상수값
    
    polynomial = polynomial.replace(' ', '').split('+')
    for i in polynomial :
        if i[-1] == 'x':
            num += 1 if len(i) == 1 else int(i[:-1])
        else:
            sum += int(i)
    if num > 0:
        answer = (str(num) if num>1 else '') + 'x' + (' + ' if sum>0 else '')
    answer += (str(sum) if sum>0 else '')
    return answer

 

 

46. 최댓값 만들기 (2)

def solution(numbers):
    numbers = sorted(numbers, reverse = True)  #예시, [4, 2, 1, -3, -5]
    return max(numbers[0]*numbers[1], numbers[-1]*numbers[-2])

 

 

47. 캐릭터의 좌표

나누셈 연산자 구분 : ①'/'은 기본적인 나눗셈, ②'//'은 나눗셈의 몫, ③%은 나눗셈의 나머지

def solution(keyinput, board):
    answer = [0, 0]
    #[0, 0]은 중앙에 위치하기 때문에 '11'일 경우 '5'거리를 이동 가능
    x = board[0] // 2
    y = board[1] // 2
    
    for i in keyinput:
        if (i == "up") and (answer[1]+1 <= y):
            answer[1] += 1
        elif (i == "down") and (answer[1]-1 >= -y):
            answer[1] -= 1
        elif (i == "left") and (answer[0]-1 >= -x):
            answer[0] -= 1
        elif (i == "right") and (answer[0]+1 <= x):
            answer[0] += 1
    return answer

 

 

48. 직사각형 넓이 구하기

#직사각형 넓이: 가로 * 세로
def solution(dots): 
    x = [dot[0] for dot in dots]
    y = [dot[1] for dot in dots]
    
    w = max(x) - min(x)
    h = max(y) - min(y)

    return w*h

 

 

49. 배열 원소의 길이

def solution(strlist):
    answer = []
    for i in strlist:
        answer.append(len(i))
    return answer

 

 

50. 컨트롤 제트

def solution(s):
    answer = 0
    s_list = list(s.split(' '))
    
    for i in range(0, len(s_list)):
        if s_list[i] == 'Z':
            answer -= int(s_list[i-1])
        else:
            answer += int(s_list[i])
    return answer

 

 

51. 소인수분해

in/not in 연산자 : 특정 값이 포함되어있는지 여부를 확인하는 명령어

def solution(n):
    answer = []
    number = 2
    while number <= n:                 #2~n값까지 소인수분해되는지 여부 확인
        if n%number == 0:
            n = n/number               #n /= number
            if number not in answer:   #소인수분해값들을 중복없도록 리스트에 추가
                answer.append(number)
        else:
            number = number + 1        #number += 1
    return answer

 


52. 숨어있는 숫자의 덧셈 (1)

.isdigit() 함수 : 숫자인지 확인하는 함수
- 예시, 
   b = '1234'
   c = "qwer"
   print(b.isdigit())    #True

def solution(my_string):
    some_list = []
    for i in list(my_string):
        if i.isdigit() == True:
            some_list.append(int(i))
    return sum(some_list)

 

 

53. 문자열 정렬하기 (1)

sorted() 함수 : 오른차순으로 값을 정렬하는 함수

def solution(my_string):
    some_list = []
    for i in list(my_string):
        if i.isdigit() == True:
            some_list.append(int(i))
    return sorted(some_list)

 

 

54. 모음 제거

def solution(my_string):
    vowel_list = ['a','e','i','o','u']
    answer = ''
    for i in list(my_string):
        if i not in vowel_list:
            answer += i
    return answer

 

 

55. 팩토리얼

factorial() 함수 : 1부터 n수까지 모든 수의 값들을 곱한 함수
- 예시, 
   from math import factorial
   print(factorial(1)) #1
   print(factorial(2)) #1*2
   print(factorial(3)) #1*2*3
   print(factorial(4)) #1*2*3*4
   print(factorial(5)) #1*2*3*4*5

#x!(1부터 x값까지 계산)을 통해 도출된 결과가 n이 되도는 x값 반환(단, x!가 도출안될 경우 최대 x값 반환)
'''def solution(n):
    number = 1
    fac = 1

    while fac <= n :    
        number = number + 1        
        fac = fac * number

    number = number - 1
    return number'''

#factorial()함수를 통해 계산한 결과를 직접 비교해서 x값 반환
from math import factorial
def solution(n):
    answer = 10
    while n < factorial(answer):
        answer -= 1
    return answer

 

 

56. 최댓값 만들기(1)

def solution(numbers):
    numbers = sorted(numbers)
    return numbers[-1]*numbers[-2]

 

 

57. 합성수 찾기

def solution(n):
    num = []    #숫사별 약수 개수를 확인할 수 있는 리스트 선언
    answer = 0  #약수의 개수를 담을 합성수 선언
    
    #2부터 n까지 약수 삽입
    for i in range(2, n+1):
        for j in range(1, i+1):
            if i%j == 0:
                num.append(i)
                
        #약수 수가 3개 이상일 경우, answer +1 카운트       
        if num.count(i) >= 3:
            answer += 1
            
    return answer

 

 

58. 주사위의 개수

나누셈 연산자 구분 : ①'/'은 기본적인 나눗셈, ②'//'은 나눗셈의 몫, ③%은 나눗셈의 나머지

def solution(box, n):
    Width  = box[0] // n
    Length = box[1] // n
    Height = box[2] // n
    
    answer = Width * Length * Height
    return answer

 

 

59. 배열 회전시키기

.pop() 함수 : 리스트의 특정 인덱스 값을 삭제 및 반환하는 기능
- 예시, 
  [1, 2, 3, 4, 5].pop(2)  # 3

def solution(numbers, direction):
    if direction == 'right':
        numbers.insert(0, numbers[-1])
        numbers.pop(-1)
        
    elif direction == 'left':
        numbers.append(numbers[0])
        numbers.pop(0)
        
    return numbers

 

 

60. 공 던지기

def solution(numbers, k):
    answer = 0
    #k*2 값이 len(numbers) 보다 크면 numbers을 확장시켜라(참고, k번을 두 칸식 건너뛰어야하니 k*2 수행)
    if len(numbers) < k*2:
        numbers = numbers * ((k*2) // len(numbers) + 1)
    answer = numbers[2*(k-1)]
    return answer