중앙백 2021. 12. 4. 22:50

이번에 부스트캠프 AI Tech를 지원하는데 코딩테스트를 보더라. 인터넷을 찾아보니까 프로그래머스 레벨1, 레벨2로 준비를 많이 하길래 나도 오늘부터 프로그래머스 문제 풀기 시작했다.

 

 

Programmers Level.1 로또의 최고 순위와 최저 순위

def solution(lottos, win_nums):
    zeros = lottos.count(0)
    count = len([x for x in lottos if x in win_nums])
    answer = [min(7-(count+zeros),6), min(7-count,6)]
    return answer

처음에는 단순히 answer = [7-count-zeros, 7-count]로 설정했는데 count = 0일때 오류가 발생했고 그래서 min을 이용해서 답을 맞췄다.

 

 

 

Programmers Level.1 신규 아이디 추천

def solution(new_id):
    new_id = new_id.lower()
    new_id = new_id.replace('~', '').replace('!', '')\   # 더 좋게 표현할 수 없나?
        .replace('@', '').replace('#', '') \
        .replace('$', '').replace('%', '') \
        .replace('^', '').replace('&', '') \
        .replace('*', '').replace('(', '') \
        .replace(')', '').replace('=', '') \
        .replace('+', '').replace('[', '') \
        .replace(']', '').replace('{', '') \
        .replace('}', '').replace(':', '') \
        .replace('?', '').replace(',', '') \
        .replace('<', '').replace('>', '') \
        .replace('/', '')
    while '..' in new_id:
        new_id = new_id.replace('..', '.')
    if new_id[0] == '.':
        new_id = new_id[1:]
    if new_id[-1] == '.':  # 오류
        new_id = new_id[:-1]
    if new_id == '':
        new_id = 'a'
    if len(new_id) >= 16:
        new_id = new_id[:15]
        if new_id[-1] == '.':
            new_id = new_id[:-1]
    while len(new_id) <= 2:
        new_id = new_id + new_id[-1]

    answer = new_id
    return answer

처음에 이렇게 풀었다. replace를 저렇게 많이 적는건 매우 비효율적으로 보인다. 그리고 답이 틀리길래 어디서 잘못됐는지 고민했고 '#오류'라고 적은 곳에서 생긴 문제였다. 아래와 같이 고침.

 

def solution(new_id):
    new_id = new_id.lower()
    words = "~!@#$%^&*()=+[{]}:?,<>/"
    for i in new_id:
        if i in words:
            new_id = new_id.replace(i, '')
    while '..' in new_id:
        new_id = new_id.replace('..', '.')
    if new_id[0] == '.':
        new_id = new_id[1:]
    if len(new_id) != 0 and new_id[-1] == '.':
        new_id = new_id[:-1]
    if new_id == '':
        new_id = 'a'
    if len(new_id) >= 16:
        new_id = new_id[:15]
        if new_id[-1] == '.':
            new_id = new_id[:-1]
    while len(new_id) <= 2:
        new_id = new_id + new_id[-1]

    answer = new_id
    return answer

'#오류'를 고쳐서 답은 맞았고 다른 사람들은 어떻게 풀었는지를 참고해서 좀 더 짧게 코드를 고쳐 봤다.

 

 

 

Programmers Level.1 숫자 문자열과 영단어

def solution(s):
    word = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    for i in range(10):
        s = s.replace(word[i], str(i))
    answer = int(s)
    return answer

 

 

 

Programmers Level.1 키패드 누르기

def solution(numbers, hand):
    answer = ''
    left = [3, 0]
    right = [3, 2]
    keypad = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [11, 0, 12]]
    for number in numbers:
        for i in range(4):
            for j in range(3):
                if keypad[i][j] == number:
                    if j == 0:
                        answer += 'L'
                        left = [i, j]
                    elif j == 2:
                        answer += 'R'
                        right = [i, j]
                    elif abs(left[0]-i)+abs(left[1]-j)<abs(right[0]-i)+abs(right[1]-j):
                        answer += 'L'
                        left = [i, j]
                    elif abs(left[0]-i)+abs(left[1]-j)>abs(right[0]-i)+abs(right[1]-j):
                        answer += 'R'
                        right = [i, j]
                    elif hand == 'left':
                        answer += 'L'
                        left = [i, j]
                    else:
                        answer += 'R'
                        right = [i, j]
    return answer

147, 369 누르는 건 쉽게 구현화했는데 2580은 어떻게 문제의 조건대로 구현 해야할 지 고민했다.

왼손과 오른손 중 어떤 쪽이 더 가까운지를 구현하기 위해 키패드를 4*3 행렬로 만들어 매번 왼손과 오른손의 위치를 기록했다. 

 

 

 

 

 

** 레벨 1임에도 그렇게 막 쉽지는 않았다.