본문 바로가기
스터디/Python

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

by SeO.V 2022. 12. 23.

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

2022-12-23

 

푼 문제 : 7의 개수, 문자열 정렬하기 (2), OX 퀴즈, 숫자 찾기

 

7의 개수

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

 

문제 설명

머쓱이는 행운의 숫자 7을 가장 좋아합니다. 정수 배열 array가 매개변수로 주어질 때, 7이 총 몇 개 있는지 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 0 ≤ array의 원소 ≤ 100,000

입출력 예

array  result
[7, 77, 17] 4
[10, 29] 0

 

 

코드 제출 :

# 제출
def solution(array):
    return sum(map(int,list(str(a).count('7') for a in array)))
# 줄여서
def solution(array):
    return sum(list(str(a).count('7') for a in array))
# 이렇게 줄여도 된다는 생각을 함.

 

해설

더보기

우선 내고서 든 건데

def solution(array):
    return sum(list(str(a).count('7') for a in array))
# 이렇게 줄여도 된다는 생각을 함.

그리고 다른 사람 풀이 중에서

# 다른 사람 풀이
def solution(array):
    return ''.join(map(str, array)).count('7')

나는 단순하게 구현하려는 생각으로 저렇게 했는데 7이란 문자(숫자)를 카운트를 할 거라면 다른 사람풀이가 좀 더 효율적이라는 걸 알음.


 

점수 : 1158(+1)


문자열 정렬하기 (2)

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

 

문제 설명

영어 대소문자로 이루어진 문자열 my_string이 매개변수로 주어질 때, my_string을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 0 < my_string 길이 < 100

입출력 예

my_string result
"Bcad" "abcd"
"heLLo" "ehllo"
"Python" "hnopty"

 

 

코드 제출 :

# 제출
def solution(my_string):
    return ''.join(sorted(my_string,key = str.lower)).lower()

 

 

해설

더보기

sorted 자체적으로 key를 쓸 수 있는 걸 기억해서 문자열 str에 lower를 적용하도록 함.

sorted(my_string, key=str.lower) # output : ['a', 'B', 'c', 'd']

그리고, ''.join() 으로 하나의 문자열로 만든 다음에 lower() 로 전부 소문자로 만들도록 함.

 

다른 사람 풀이 중에서 ''.join(sorted(my_string.lower())) 이것도 간단하고 좋은 듯.

점수 : 1159(+1)


OX 퀴즈

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

 

문제 설명

덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 연산 기호와 숫자 사이는 항상 하나의 공백이 존재합니다. 단 음수를 표시하는 마이너스 기호와 숫자 사이에는 공백이 존재하지 않습니다.
  • 1 ≤ quiz의 길이 ≤ 10
  • X, Y, Z는 각각 0부터 9까지 숫자로 이루어진 정수를 의미하며, 각 숫자의 맨 앞에 마이너스 기호가 하나 있을 수 있고 이는 음수를 의미합니다.
  • X, Y, Z는 0을 제외하고는 0으로 시작하지 않습니다.
  • 10,000 ≤ X, Y ≤ 10,000
  • 20,000 ≤ Z ≤ 20,000
  • [연산자]는 + 와 - 중 하나입니다.

입출력 예

quiz  result
["3 - 4 = -3", "5 + 6 = 11"] ["X", "O"]
["19 - 6 = 13", "5 + 66 = 71", "5 - 15 = 63", "3 - 1 = 2"] ["O", "O", "X", "O"]

 

 

코드 제출 :

# 제출
def solution(quiz):
    answer = []
    for exp in quiz:
        if exp.split()[1] == '+':
            answer.append("O") if int(exp.split()[-1]) == (int(exp.split()[0]) + int(exp.split()[2])) else answer.append("X")
        else:
            answer.append("O") if int(exp.split()[-1]) == (int(exp.split()[0]) - int(exp.split()[2])) else answer.append("X")
    return answer

# 줄여서
# 제출
def solution(quiz):
    answer = []
    for exp in quiz:
        x,op,y,assign,ans = exp.split()
        if op == '+':
            answer.append("O") if int(ans) == int(x) + int(y) else answer.append("X")
        else:
            answer.append("O") if int(ans) == int(x) - int(y) else answer.append("X")
    return answer
# eval 사용
def solution(quiz):
    return ["O" if eval(exp.replace('=', '==')) else "X" for exp in quiz]

 

 

해설

더보기

단순하게 풀긴 했는데 해보고 생각해보니 split() 때문에 속도라던가 늦어졌으므로 줄여서도 제출 성공하긴 했음. 근데 eval()을 이용한 게 많이 보여서 eval로는 위처럼

def solution(quiz):
    return ["O" if eval(exp.replace('=', '==')) else "X" for exp in quiz]

이런 걸 생각함. eval로서 ‘=’ 는 ‘==’로 replace 한 다음에 exp 자체를 eval 로 감싸서.

수식 자체로 eval("3 - 4 == -3") 해보니까 False 나온 거 보고 만듬. 근데 이래서 숏코딩으로 좋긴 하구나 싶음.


 

점수 : 1161(+2)


숫자 찾기

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

 

문제 설명

정수 num과 k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 0 < num < 1,000,000
  • 0 ≤ k < 10
  • num에 k가 여러 개 있으면 가장 처음 나타나는 자리를 return 합니다
  •  

입출력 예

num  result
29183 1 3
232443 4 4
123456 7 -1

 

 

코드 제출 :

# 제출
def solution(num, k):
    return str(num).find(str(k)) + 1 if str(num).find(str(k)) != -1 else -1

 

해설

더보기

ref : https://docs.python.org/ko/3/library/stdtypes.html?#str.find

str.find(sub[, start[, end]]) 부분 문자열 sub 가 슬라이스 s[start:end] 내에 등장하는 가장 작은 문자열의 인덱스를 돌려줍니다. 선택적 인자 start 와 end 는 슬라이스 표기법으로 해석됩니다. sub 가 없으면 -1 을 돌려줍니다.

find 메서드 이용.

근데 좀 깔끔하지 않은 거 같아서 찾아보니

# 다른 사람 풀이
def solution(num, k):
    return -1 if str(k) not in str(num) else str(num).find(str(k)) + 1

이게 더 취향. 

점수 : 1163(+2)


 

 

여기까지 3문제.