완주하지 못한 선수
def solution(participant, completion):
dic = {}
for name in participant:
if dic.get(name):
dic[name] += 1
else:
dic[name] = 1
for name in completion:
dic[name] -= 1
for key in dic:
if dic[key] > 0:
return key
참여자 명단과 인원을 추가한 dic에서 완주자 명단과 인원을 제거하였다. 이후 dic에 value값이 1인 key를 리턴하면 해결할 수 있다.
collections.Counter(participant) - collections.Counter(completion)
해당 문제는 counter를 사용하여 해결할 수도 있는데, 위 코드처럼 counter끼리 빼는 것이 가능하다. 값은 Counter({'leo': 1})과 같은 형식이므로 list로 바꿔서 해결한다.
체육복
def solution(n, lost, reserve):
cloth = set(i+1 for i in range(n))
for i in range(len(lost)):
if lost[i] in reserve:
reserve.remove(lost[i])
lost[i] = 0
for i in lost:
if i == 0:
continue
cloth.remove(i)
for i in reserve:
if i-1 not in cloth and i-1 > 0:
cloth.add(i-1)
elif i+1 not in cloth and i+1 <= n:
cloth.add(i+1)
return len(cloth)
cloth를 set형으로 선언해 중복된 값이 추가되지 않도록 하였다. lost와 reserve에 둘 다 포함되어 있는 학생은 체육복을 하나만 갖고 있는 것과 같아지기 때문에 이를 두 리스트에서 제거한다.
신규 아이디 신청
def solution(new_id):
new_id = new_id.lower()
answer = ''
for word in new_id:
if word.isalnum() or word in '-_.':
answer += word
while '..' in answer:
answer = answer.replace('..','.')
answer = answer[1:] if answer[0] == '.' and len(answer) > 1 else answer
answer = answer[:-1] if answer[-1] == '.' else answer
if answer == '':
answer = 'a'
if len(answer) >= 16:
answer = answer[0:15]
answer = answer[:-1] if answer[-1] == '.' else answer
if len(answer) <= 2:
answer += answer[-1]*(3-len(answer))
return answer
isalnum()으로 해당 문자가 영어, 한글, 숫자인지 확인하였다. 연속된 문자가 2번 이상일 때 이를 제거하는 방법으로 while과 replace()를 사용할 수 있다. 문자열 길이에 따른 예외 처리도 하였다.
숫자 문자열과 영단어
def solution(s):
dic = {'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4',
'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9'}
for d in dic.keys():
if d in s:
s = s.replace(d, dic[d])
return s
dict를 사용해 영단어를 숫자로 바꾸었다. 배열과 index를 사용하여 문제를 해결할 수도 있다.
키패드 누르기
def solution(numbers, hand):
answer = ''
left = 10
right = 12
for num in numbers:
if num in [1, 4, 7]:
answer += "L"
left = num
elif num in [3, 6, 9]:
answer += "R"
right = num
else:
num = 11 if num == 0 else num
left_distance = sum(divmod(abs(num-left),3))
right_distance = sum(divmod(abs(num-right),3))
if left_distance < right_distance:
answer += "L"
left = num
elif left_distance == right_distance:
if hand == "left":
answer+= "L"
left = num
else:
answer += "R"
right = num
else:
answer += "R"
right = num
return answer
해당 문제는 2, 5, 8, 0을 입력할 때 두 엄지손가락의 현재 키패드 위치에서 더 가까운 쪽을 사용하는 것을 구현해야 했는데, divmod(), abs()를 사용해 거리를 3으로 나눈 몫과 나머지를 합쳐서 해결하였다.