프로그래머스 level 1 (1)

coguma·2021년 8월 29일
0

CodingPython

목록 보기
3/7

완주하지 못한 선수

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/42576
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로 바꿔서 해결한다.

체육복

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/42862
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에 둘 다 포함되어 있는 학생은 체육복을 하나만 갖고 있는 것과 같아지기 때문에 이를 두 리스트에서 제거한다.

신규 아이디 신청

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/72410
def solution(new_id):
    #1단계
    new_id = new_id.lower()
    
    #2단계
    answer = ''
    for word in new_id:
        if word.isalnum() or word in '-_.':
            answer += word
            
    #3단계
    while '..' in answer:
        answer = answer.replace('..','.')
        
    #4단계
    answer = answer[1:] if answer[0] == '.' and len(answer) > 1 else answer
    answer = answer[:-1] if answer[-1] == '.' else answer
    
    #5단계
    if answer == '':
        answer = 'a'
    
    #6단계:
    if len(answer) >= 16:
        answer = answer[0:15]
        
    answer = answer[:-1] if answer[-1] == '.' else answer
    
    #7단계
    if len(answer) <= 2:
        answer += answer[-1]*(3-len(answer))
        
    return answer
isalnum()으로 해당 문자가 영어, 한글, 숫자인지 확인하였다. 연속된 문자가 2번 이상일 때 이를 제거하는 방법으로 while과 replace()를 사용할 수 있다. 문자열 길이에 따른 예외 처리도 하였다.

숫자 문자열과 영단어

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/81301
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를 사용하여 문제를 해결할 수도 있다.

키패드 누르기

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/67256
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으로 나눈 몫과 나머지를 합쳐서 해결하였다.
profile
코딩하는 고구마

0개의 댓글

관련 채용 정보