본문 바로가기
스터디/Python

[CodingTest][2022-12-25~28]프로그래머스 코딩테스트 Lv.0 문제들

by SeO.V 2022. 12. 29.

프로그래머스 코딩테스트 Lv.0 문제들

2022-12-25~28 까지 12문제.

푼 문제 : 문자열 계산하기, 한 번만 등장한 문자, 인덱스 바꾸기, 영어가 싫어요, 369게임, 가까운 수, 중복된 문자 제거, k의 개수, A로 B 만들기, 이진수 더하기, 치킨쿠폰, 로그인 성공

문자열 계산하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120902

문제 설명

my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.

제한사항

  • 연산자는 +, -만 존재합니다.
  • 문자열의 시작과 끝에는 공백이 없습니다.
  • 0으로 시작하는 숫자는 주어지지 않습니다.
  • 잘못된 수식은 주어지지 않습니다.
  • 5 ≤ my_string의 길이 ≤ 100
  • my_string을 계산한 결과값은 1 이상 100,000 이하입니다.
    • my_string의 중간 계산 값은 -100,000 이상 100,000 이하입니다.
    • 계산에 사용하는 숫자는 1 이상 20,000 이하인 자연수입니다.
    • my_string에는 연산자가 적어도 하나 포함되어 있습니다.
  • return type 은 정수형입니다.
  • my_string의 숫자와 연산자는 공백 하나로 구분되어 있습니다.

입출력 예

my_string result
"3 + 4" 7

코드 제출 :

# 제출
def solution(my_string):
    return eval(my_string)

해설

eval이면 다 되서..


한 번만 등장한 문자

link : https://school.programmers.co.kr/learn/courses/30/lessons/120896

문제 설명

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

제한사항

  • 0 < s의 길이 < 1,000
  • s는 소문자로만 이루어져 있습니다.

입출력 예

s result
"abcabcadc" "d"
"abdc" "abcd"
"hello" "eho"

코드 제출 :

# 제출
def solution(s):
    answer = ''
    for char in s:
        if s.count(char) == 1:
            answer += char
    return ''.join(sorted(answer))

해설

줄여보고 싶었는데
''.join(sorted([char for char in s if s.count(char) == 1]))
이런 형식 보고 이렇게 할 걸 싶은.


인덱스 바꾸기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120895

문제 설명

문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 1 < my_string의 길이 < 100
  • 0 ≤ num1, num2 < my_string의 길이
  • my_string은 소문자로 이루어져 있습니다.
  • num1num2

입출력 예

my_string num1 num2 result
"hello" 1 2 "hlelo"
"I love you" 3 6 "I l veoyou"

코드 제출 :

# 제출
def solution(my_string, num1, num2):
    my_string = [*my_string]
    my_string[num1], my_string[num2] = my_string[num2], my_string[num1]
    return ''.join(my_string)

해설

ref : https://velog.io/@insutance/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%B3%84%ED%91%9C-Asterisk-%EC%9D%98-%EC%97%AD%ED%95%A0

*를 이용해서 리스트,문자열의 unpacking을 이용해서 띄어쓰기까지 포함하게 한 다음에 list의 indexing을 바꾸는 식으로 함.


영어가 싫어요

link : https://school.programmers.co.kr/learn/courses/30/lessons/120894

문제 설명

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.

제한사항

  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
  • 1 ≤ numbers의 길이 ≤ 50
  • "zero"는 numbers의 맨 앞에 올 수 없습니다.

입출력 예

numbers result
"onetwothreefourfivesixseveneightnine" 123456789
"onefourzerosixseven" 14067

코드 제출 :

# 제출
def solution(numbers):
    num_dict = {"zero":0, "one":1, "two":2, "three":3, "four":4, "five":5, "six":6, "seven":7, "eight":8, "nine":9}
    for k in num_dict:
        numbers = numbers.replace(k,str(num_dict[k]))
    return int(numbers)
# 다른 사람 풀이
def solution(numbers):
    for num, eng in enumerate(["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]):
        numbers = numbers.replace(eng, str(num))
    return int(numbers)

해설

딕셔너리 쓰는 걸 생각했는데 list의 index와 동일하니까 다른 사람 풀이 처럼 하는 것도 괜찮았을 듯.


369게임

link : https://school.programmers.co.kr/learn/courses/30/lessons/120891

문제 설명

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 1 ≤ order ≤ 1,000,000

입출력 예

order result
3 1
29423 2

코드 제출 :

# 제출
def solution(order):
    answer = 0
    answer += str(order).count('3')
    answer += str(order).count('6')
    answer += str(order).count('9')
    return answer
# 다른 사람 풀이
def solution(order):
    return sum(map(lambda x: str(order).count(str(x)), [3, 6, 9]))

해설

count 간단하게 하긴 했는데 시간복잡도는 확실히 낮을 듯 함.
return sum(map(lambda x: str(order).count(str(x)), [3, 6, 9]))
이 쪽이 숏 코딩으로는 바람직 할 듯


가까운 수

link : https://school.programmers.co.kr/learn/courses/30/lessons/120890

문제 설명

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

입출력 예

array n result
[3, 10, 28] 20 28
[10, 11, 12] 13 12

코드 제출 :

# 제출 - 5번 실패 / 이외 성공
def solution(array, n):
    answer = [abs(num-n) for num in array]
    return array[answer.index(min(answer))]
# 제출
def solution(array, n):
    answer = [abs(num-n) for num in sorted(array)]
    return sorted(array)[answer.index(min(answer))]
# 다른 사람 풀이
def solution(array, n):
    array.sort(key = lambda x : (abs(x-n), x-n))
    return array[0]

해설

테스트케이스 5번에서 틀리길래 질문한 거 보니까 주어지는 테스트 케이스의 리스트가 정렬이 오름차순이 아닐 경우, 틀리는 것 같아서 테스트케이스 [9, 11, 12], 10, 9로 넣어서 하니까 틀리길래, sorted를 둘 다 추가하니 성공.


중복된 문자 제거

link : https://school.programmers.co.kr/learn/courses/30/lessons/120888

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ my_string ≤ 110
  • my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
  • 대문자와 소문자를 구분합니다.
  • 공백(" ")도 하나의 문자로 구분합니다.
  • 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.

입출력 예

my_string result
"people" "peol"
"We are the world" "We arthwold"

코드 제출 :

# 제출
from collections import OrderedDict
def solution(my_string):
    return ''.join(OrderedDict.fromkeys(my_string))
# 다른 사람 풀이 1
def solution(my_string):
    return ''.join(dict.fromkeys(my_string))
# 다른 사람 풀이 2
def solution(my_string):
    answer = ''
    for i in my_string:
        if i not in answer:
            answer+=i
    return answer

해설

ref : https://docs.python.org/3/library/collections.html#collections.OrderedDict

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

예전에 중복 문자열 없애는 방법 중에서 찾다가 발견한 방법으로,

OrderedDict의 특징으로는

  1. OrderedDict는 Key 값으로 정렬할수 있다.
  2. 파이썬 3.7부터는 내장 dict 클래스가 삽입 순서를 기억하는 기능이 있어서 이 라이브러리 자체는 덜 사용하지만 이 라이브러리의 fromkeys와, 딕셔너리의 특징인 중복되는 키는 저장되지 않는다를 이용한 것.

OrderedDict.fromkeys(my_string) 으로 생성시, fromkeys 안의 iterable을 key값으로 해서 dict 객체를 생성할텐데, 이때 중복되는 key는 버려지므로, 중복되는 것들은 그대로 없이 대소문자 및 띄어쓰기까지 하나하나 key로 인지 후 값은 None으로 만들어진걸 join하면, dict의 key값만을 join하므로 값이 나옴.

그런데 요즘에는 그냥 라이브러리 없이도 되는 듯. 다른사람 풀이 보니

# 다른 사람 풀이 1
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

이렇게 한 것도 봤는데 이것도 간단하고 좋은 듯.


k의 개수

link : https://school.programmers.co.kr/learn/courses/30/lessons/120887

문제 설명

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0

코드 제출 :

# 제출
def solution(i, j, k):
    answer = 0
    for num in range(i,j+1):
        answer += str(num).count(str(k))
    return answer
# 숏코딩
def solution(i, j, k):
    return sum(str(i).count(str(k)) for i in range(i,j+1))

해설

비슷하게 바꾸지 않고 있는 것만 += 누적으로 더하다가 줄일 수 있을 거 같아서 sum안의 iterable은 for돌리면서 자동적으로 묶이니까 처리되는 듯.


A로 B 만들기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120886

문제 설명

문자열 beforeafter가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 0 < before의 길이 == after의 길이 < 1,000
  • beforeafter는 모두 소문자로 이루어져 있습니다.

입출력 예

before after result
"olleh" "hello" 1
"allpe" "apple" 0

코드 제출 :

# 제출
def solution(before, after):
    return 1 if sorted(before) == sorted(after) else 0

해설

모두 소문자고 중복 상관없다면 sorted로 전부 정렬할 때 동일한 글자들이 있다면 어떻게 조합해도 동일할 수 있다는 뜻이니 sorted처리 후 동일하면 1 반환.


이진수 더하기

link : https://school.programmers.co.kr/learn/courses/30/lessons/120885

문제 설명

이진수를 의미하는 두 개의 문자열 bin1bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.

제한사항

  • return 값은 이진수를 의미하는 문자열입니다.
  • 1 ≤ bin1, bin2의 길이 ≤ 10
  • bin1bin2는 0과 1로만 이루어져 있습니다.
  • bin1bin2는 "0"을 제외하고 0으로 시작하지 않습니다.

입출력 예

bin1 bin2 result
"10" "11" "101"
"1001" "1111" "11000"

코드 제출 :

# 제출
def solution(bin1, bin2):
    return bin(int(bin1,2)+int(bin2,2))[2:]

null

해설

int('N진수문자열',N)으로 하면 해당의 10진수로 변환하므로 해당 수의 십진수끼리의 합을 다시 2진수로 바꾸면 됨


치킨 쿠폰

link : https://school.programmers.co.kr/learn/courses/30/lessons/120884

문제 설명

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

입출력 예

chicken result
100 11
1,081 120

코드 제출 :

# 첫번째 실패
def solution(chicken):
    answer = chicken % 10
    while True:
        answer += chicken // 10
        chicken = chicken // 10
        if chicken == 0:
            return answer
# 제출
def solution(chicken):
    answer = 0
    while chicken // 10 >= 1:
        answer += chicken // 10
        chicken = (chicken // 10) + (chicken % 10)
    return answer

null

해설

문제에서 모든 주문한 닭 1마리당 쿠폰이 하나이고 10개의 쿠폰 당 1마리라고 해서 10으로 floor division 했을 때 0으로 떨어지는 게 아니라면 answer인 쿠폰의 갯수에 누적을 하고 나머지와 몫을 다시 chicken으로 더하고 거기서 다시 answer로 누적하는 while문.

그런데 다른 사람 풀이 중에서 신박했던 거

# 다른 사람 풀이 1
def solution(chicken):
    answer = (max(chicken,1)-1)//9
    return answer
# 다른 사람 풀이 2
def solution(chicken):
    return int(chicken*0.11111111111)

1번 보다는 2번이 내가 맨 처음에 문제를 단순하게 구현하려는 (((chicken // 10) // 10) // 10) 이런 식으로 주어진 최대값으로 하려던 걸 단순하게 한 느낌.


로그인 성공

link : https://school.programmers.co.kr/learn/courses/30/lessons/120883

문제 설명

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

  • 아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
  • 로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

제한사항

  • 회원들의 아이디는 문자열입니다.
  • 회원들의 아이디는 알파벳 소문자와 숫자로만 이루어져 있습니다.
  • 회원들의 패스워드는 숫자로 구성된 문자열입니다.
  • 회원들의 비밀번호는 같을 수 있지만 아이디는 같을 수 없습니다.
  • id_pw의 길이는 2입니다.
  • id_pw와 db의 원소는 [아이디, 패스워드] 형태입니다.
  • 1 ≤ 아이디의 길이 ≤ 15
  • 1 ≤ 비밀번호의 길이 ≤ 6
  • 1 ≤ db의 길이 ≤ 10
  • db의 원소의 길이는 2입니다.

입출력 예

id_pw db result
["meosseugi", "1234"] [["rardss", "123"], ["yyoom", "1234"], ["meosseugi", "1234"]] "login"
["programmer01", "15789"] [["programmer02", "111111"], ["programmer00", "134"], ["programmer01", "1145"]] "wrong pw"
["rabbit04", "98761"] [["jaja11", "98761"], ["krong0313", "29440"], ["rabbit00", "111333"]] "fail"

코드 제출 :

# 제출
def solution(id_pw, db):
    for info in db:
        if info[0] == id_pw[0]:
            return 'login' if info[1] == id_pw[1] else 'wrong pw'
    return 'fail'

해설

if 문으로 조건 해서 해결


여기까지 12문제 28일까지.