Python

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

노력하는 백곰 2024. 8. 6. 06:16

■ 출처

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

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

 

 

■ 연습문제

1. 옹알이 (1)

#조카가 발음할 수 있는 4가지 발음이 babbling에 존재할 경우, 각각의 길이를 확인해서 answer에 카운트
def solution(babbling):
    answer = 0
    nephew_list  = ["aya","ye","woo","ma"]
    for i in babbling:
        result = 0
        for j in range(0, len(nephew_list)):
            if i.find(nephew_list[j]) != -1:
                result += len(nephew_list[j])
        if len(i) == result:
            answer += 1
    return answer

 


2. 다음에 올 숫자

등차수열 : 연속하는 두 항의 차이가 모두 일정한 수열
등비수열 : 각 항이 이전 항과 일정한 수준을 가지는 수열

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

def solution(common):
    if (common[1]-common[0]) == common[2]-common[1]:
        return (common[-1] + (common[-2]-common[-3]))
    elif (common[1]//common[0]) == common[2]//common[1]:
        return (common[-1] * (common[-2]//common[-3]))

 

 

3. 연속된 수의 합

#num으로 total을 나눠구한 중앙값을 기준으로 순차적으로 '+/-'하하여 'result'값이 'total'이 되도록 반복하는 과정
def solution(num, total):
    calcul = total // num
    calcul_list = []
    
    #return [i for i in range(calcul-(num-1)//2, calcul+(num+2)//2)]
    for i in range(calcul-(num-1)//2, calcul+(num+2)//2):
        calcul_list.append(i)
    return calcul_list

 

 

4. 종이 자르기

def solution(M, N):
    answer = (M*N)-1
    return answer

 

 

5. 문자열 밀기

find() 함수 : 특정 문자열의 위치, 인덱스 번호를 찾는 함수(만약, 지정한 문자열을 찾지 못하면 '-1' 반환)
- 예시, str.find(찾을 문자, 시작 index, 끝 index)     ※ 2, 3번째 파라미터 생략 가능

def solution(A, B): 
    return (B * 2).find(A)

 

 

6. 잘라서 배열로 저장하기

def solution(my_str, n):
    return [my_str[i:i+n] for i in range(0, len(my_str), n)]

 

 

7. 7의 개수

.join() 함수 : 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸는 함수
map() 함수 : 여러 개의 데이터를 받아서 각각의 요소에 함수를 적용한 결과를 반환하는 내장 함수
- 예시, map(①적용할 함수, ②함수를 적용할 데이터 집합)

count() 함수 : 문자열 내부에서 특정 문자, 혹은 문자열이 포함되어있는지 여부를 계산하는 함수

def solution(array):
    return ''.join(map(str, array)).count('7')

 

 

8. 문자열 정렬하기 (2)

.lower() 함수 : 문자열 내 알파벳을 소문자로 변환하는 함수(즉, 대문자 → 소문자 반환)
sorted() 함수 : 새로운 리스트를 정렬

def solution(my_string):
    return ''.join(sorted(list(','.join(my_string.lower()).split(','))))

 

 

9. 세균 증식

#n개 세균 수에서 1시간당 2배 숫자로 증가
def solution(n, t):
    answer = n
    for i in range(0, t):
        answer *= 2
    return answer

 

 

10. 제곱수 판별하기

#참고, 제곱수를 구할 때 'n'에서 0.5를 곱하면 해당 수 확인 가능
def solution(n):
    answer = 0
    if (int(n**0.5)**2) == n:
        return 1
    else:
        return 2

 

 

11. 문자열안에 문자열

def solution(str1, str2):
    return 1 if str2 in str1 else 2

 


12. OX퀴즈

eval() 함수 : 문자열로 받은 사칙연산 식을 실행하는 함수

def change_oper(operator):
    operator = operator.replace('=', '==')
    return eval(operator)

#한줄코딩: for문+if문
def solution(quiz):
    return ["O" if change_oper(quiz[i])==1 else "X" for i in range(0, len(quiz))]
    
    """answer = []
    for i in range(0, len(quiz)):    
        if change_oper(quiz[i]) == 1:
            answer.append("O")
        else:
            answer.append("X")"""

 

 

13. 자릿수 더하기

list() 함수 : 리스트 형식을 반환하는 함수

- 참고, 문자요소에 list() 함수를 사용할 경우, 상세 문자요소로 구분 가능

def solution(n):
    print(type(n))
    return sum(list(map(int, list(str(n)))))

 

 

14. n의 배수 고르기

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

def solution(n, numlist):
    return [numlist[i] for i in range(0, len(numlist)) if numlist[i]%n == 0]
    
    """answer = []
    for i in range(0, len(numlist)):
        if numlist[i]%n == 0:
            answer.append(numlist[i])
    return answer"""

 

 

15. 숫자 찾기

find() 함수 : 문자열 내부에서 특정 문자가 어디에 위치하는지 왼쪽부터 찾는 함수(숫자일 경우, 문자 타입으로 변화 必)

def solution(num, k):
    return int(str(num).find(str(k))+1) or -1

 

 

16. 배열의 유사도

set() 함수 : 집합(set) 타입으로 변경하여 중복된 요소를 제거하는 함수

비트 연산자 & : 비트 단위 AND 연산을 수행
- 예시, 두 숫자의 각 비트를 비교하여 둘다 1일 때 해당 비트를 1로 설정하고, 그렇지 않으면 0으로 설정

논리 연산자 and : 논리적인 AND 연산을 수행
- 예시, 두 개의 피연산자가 모두 True일 때 True를 반환하고 그렇지 않으면 False를 반환

def solution(s1, s2):
    return len(set(s1)&set(s2))
    
    """answer = 0
    for i in range(0, len(s2)):
        for j in range(0, len(s1)):
            if s2[i] == s1[j]:
                answer += 1
    return answer"""

 

 

17. 문자열 계산하기

def solution(my_string):
    return eval(my_string)

 

 

18. 가장 큰 수 찾기

.index() 함수 : 리스트 중에서 특정한 원소가 몇 번째에 처음으로 등장했느지 알려주는 함수
- 예시, [123, 421, 212].index(421) → 1

def solution(array):
    return [max(array), array.index(max(array))]

 

 

19. 편지

def solution(message):
    return len(message)*2

 

 

20. 약수 구하기

def solution(n):
    return [i for i in range(1, n+1) if (n%i==0)]
    
    """answer = []
    for i in range(1, n+1):
        if n%i == 0:
            answer.append(i)
    return answer"""

 

 

21. 한 번만 등장한 문자

'='과 '=='의 차이점
- = : 변수를 지정하는  의미
- == : if문과 함께 쓰이는 것으로 값과 같은지 확인하는 의미

def solution(s):
    answer = []
    cnt = 0
    alp_list = list(set(list(s)))
    
    for i in range(0, len(alp_list)):
        for j in range(0, len(s)):
            if alp_list[i] == s[j]:
                cnt += 1
        if cnt == 1:
            answer.append(alp_list[i])
        cnt = 0
    return ''.join(sorted(answer))

"""def solution(s):
    answer = "".join(sorted([ch for ch in s if s.count(ch) == 1]))
    return answer"""

 


22. 인덱스 바꾸기

def solution(my_string, num1, num2):
    my_string = list(my_string)
    my_string[num1], my_string[num2] = my_string[num2], my_string[num1]
    answer = ''.join(my_string)
    return answer

 

 

23. 영어가 싫어요

enumerate() 함수 : 반복문(for 등)에서 순서와 요소 값을 동시에 반환받을 때 사용하는 함수

def solution(numbers):
    number_list = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    for idx, val in enumerate(number_list):
        numbers = numbers.replace(val, str(idx))
    return int(numbers)

 

 

24. 대문자와 소문자

알파벳 대/소문자 변환
- .upper() 함수 : 소문자 → 대문자 반환하는 함수
- .lower() 함수 : 대문자 → 소문자 반환하는 함수
알파벳 대/소문자인지 여부 반환
- .isupper() 함수 : 대문자 → True 반환하는 함수
- .islower() 함수 : 소문자 → True 반환하는 함수

def solution(my_string):
    answer = ''
    for i in range(0, len(my_string)):
        if my_string[i].isupper() == True:
            answer += my_string[i].lower()
        else:
            answer += my_string[i].upper()
    return answer

 

 

25. 암호 해독

def solution(cipher, code):
    return cipher[code-1::code]

 

 

26. 369게임

def solution(order):
    cnt = 0
    for i in list(str(order)):
        if (i=='3') or (i=='6') or (i=='9'):
            cnt += 1
    return cnt

 

 

27. 가까운 수

#answer 배열 요소값과 n값에 절대값을 적용하여 빼서 최소값에 해당하는 인덱스 배열요소값을 반환
#여러개를 반환할 경우, 작은 수를 반환
def solution(array, n):
    abs_num = []
    array.sort()
    
    for i in array:
        abs_num.append(abs(i-n))      
    answer = [array[abs_num.index(min(abs_num))]]
    
    if len(answer) > 1:
        return min(answer)
    else:
        return answer[0]

 

 

28. 삼각형의 완성조건 (1)

def solution(sides):
    max_num = max(sides)
    del sides[sides.index(max_num)]
    return 1 if max_num < sum(sides) else 2
    
    """if max_num < sum(sides):
        return 1
    else:
        return 2"""

 

 

29. 중복된 문자 제거

.join() 함수 : 매개변수로 들어온 리스트에 있는 요소들을 하나의 문자열로 합치는 함수
dict.fromkeys(seq, value) 함수 : 딕셔너리를 생성할 때 편리하게 사용하는 메소드
- seq : 생성하려는 dictionary의 key 목록
- value : 생성하려는 dictionary의 value값

def solution(my_string):
    return ''.join(dict.fromkeys(my_string))

"""def solution(my_string):
    answer = ''
    for i in my_string:
        if i not in answer:
            answer += i
    return answer"""

 

 

30. k의 개수

def solution(i, j, k):
    cnt = 0
    for i in range(i, j+1):
        #list함수를 활용해서 ['1']....['1', '0']...형식으로 변환하여 k숫자 개수를 찾는 방법
        for j in lis0t(str(i)):
            if j == str(k):
                cnt += 1
    return cnt