매일매일 코딩테스트

양진혁·2022년 3월 17일
0

문제풀이

문제1

프로그래머스 level1 체육복

문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한사항
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
입출력 예

nlostreservereturn
5[2, 4][1, 3, 5]5
5[2, 4][3]4
3[3][1]2

입출력 예 설명
예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.

예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.

def solution(n, lost, reserve):
	#총 인원에서 잃어버린 인원수를 제거
    answer = n - len(lost)
    # 21.08 추가된 테스트 케이스 13,18은 lost와 reverse를 순서대로
    # 들어오게 해야하므로 sort를 사용해야 한다.
    lost = sorted(lost)
    reserve = sorted(reserve)
 	# 체육복이 도난 당했을 경우 잃어버린 사람의 옷과 여분의 옷 둘다 제거
    # 그 후 옷을 찾았기 때문에 answer +=1
    for i in reserve[:]:
        if i in lost[:]:
            lost.remove(i)
            reserve.remove(i)
            answer +=1
    # 만약 여분의 옷이 잃어버린 옷의 -1 혹은 +1 이라면 잃어버린 사람과
    # 여분의 옷을 하나씩 제거한 후 반복문 멈추기
    for i in lost[:]:
        for j in reserve[:]:
            if j == (i+1) or j == (i-1):
                lost.remove(i)
                reserve.remove(j)
                answer +=1
                break
    return answer

이 문제를 풀 때 13,18번 테스트 케이스의 추가로 인해서 힘들었다. 또한 for문 사용중 remove()를 사용하면 원소가 하나씩 제거되지 않고 누락하는 부분이 발생하기 때문에 꼭 [:]를 사용해서 그 리스트의 복사본을 루프에 넣고 돌리면 원하는 값을 도출 할 수 있다.

문제 2

프로그래머스 level1 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0zero
1one
2two
3three
4four
5five
6six
7seven
8eight
9nine

제한사항
1 ≤ s의 길이 ≤ 50
s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
입출력 예

sresult
"one4seveneight"1478
"23four5six7"234567
"2three45sixseven"234567
"123"123
#dict 형태로 각 숫자의 영어와 숫자를 key value 값으로 저장
num = {'zero':'0', 'one':'1', 'two':'2', 'three':'3', 'four':'4', 'five':'5', 'six':'6', 'seven':'7', 'eight':'8', 'nine':'9'}
def solution(s):
  #만약 s가 숫자라면 int(s) 출력
  if s.isdigit():
    return int(s)
  #반복문을 사용해서 num의 key value값을 모두 받아옴
  for i,j in num.items():
  	#만약 i 값이 s 안에 있다면 replace를 통해서 i 값을 j로 대체한다.
    if i in s:
      s = s.replace(i,j)
  return int(s)

문제 3

프로그래머스 level 1 완주하지못한 선수

문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.

participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"
def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(participant)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[-1]

sort()를 한 후 for문을 작성해서 시간복잡도가 nlogn으로 제 시간 안으로 문제를 해결했다.
그러나 이 문제는 해시 문제였고 다른 사람의 답변을 보니 앞으로 이런 문제가 나올 때 어떻게 풀어야 하는지 알 수 있었다.

def solution(participant, completion):
    answer = ''
    temp = 0
    dic = {}
    for part in participant:
        dic[hash(part)] = part
        temp += int(hash(part))
    for com in completion:
        temp -= hash(com)
    answer = dic[temp]
    return answer

dic 안에 key value로 해시값과 단어를 넣은 후 completion에 들어있는 사람들 수 역시 해시값으로 변경해서 그걸 빼주고 남은 해시수를 dict에 대입하여 그 value를 가져왔다.
이 풀이법이 가장 출제의도에 근접하다고 생각한다.

문제3

프로그래머스 level1 없는숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ numbers의 길이 ≤ 9
0 ≤ numbers의 모든 원소 ≤ 9
numbers의 모든 원소는 서로 다릅니다.

입출력 예

numbersresult
[1,2,3,4,6,7,8,0]14
[5,8,4,0,6,7,9]6
def solution(numbers):
  return 45 - sum(numbers)

문제 4

프로그래머스 level1 약수의 개수와 덧셈

문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ left ≤ right ≤ 1,000

입출력 예

leftrightresult
131743
242752
def solution(left,right):
  res = 0
  #left부터 right 까지 반복
  for i in range(left,right+1):
  #for 문이 돌때마다 약수를 담은 array 초기화
    arr=[]
    for j in range(1,i+1):
    #1부터 자기자신까지 나눌 때 나머지가 있는지 없는지 확인
      if i%j==0:
        arr.append(j)
    if len(arr)%2 ==0:
        res +=j
    else:
        res -=j
  return res

문제 5

프로그래머스 level1 부족한금액 계산하기

문제 설명
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항
놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

입출력 예

pricemoneycountresult
320410
def solution(price, money, count):
  res = 0
  for i in range(1,count+1):
    res +=price *i
  if res >money:
    return res-money
  else:
    return 0

0개의 댓글