728x90

출처 : 프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

def solution(phone_book):
    answer = True
    # 전화번호부 해시 생성
    hashmap = {}
    for phone_num in phone_book:
        hashmap[phone_num] = 1

    # 접두사 찾기
    for phone_num in phone_book:
        tmp = ''
        for num in phone_num:
            tmp += num
            # 하나씩 입력한 전화번호의 번호가 해쉬맵에 있고 자기 자신 번호가 아닐 때
            if tmp in hashmap and tmp != phone_num:
                answer = False
    return answer

풀이 1

해시 문제라 해시로 풀이했다.

전화번호를 해시 맵에 입력해주고,

한 사람의 전화번호의 번호를 tmp에 저장하고 hashmap에 있는 전화번호와 비교하며 자기 자신인 경우를 제외한다.

def solution(phone_book):
    answer = True
    pbook = sorted(phone_book)

    for a,b in zip(pbook, pbook[1:]):
        if b.startswith(a):
            return False
    return answer

풀이 2

전화번호가 문자열이니 정렬하고 두 번째 전화번호부터 비교한다.

startswith()를 사용했다.

 

728x90

https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

출처 : 프로그래머스

def solution(participant, completion):
    # 정렬
    participant.sort()
    completion.sort()

    for i,j in zip(participant, completion):
        if i!=j:
            return i
    return participant[-1]
728x90

https://programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

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

programmers.co.kr

출처 : 프로그래머스

 


def solution(board, moves):
    answer = 0
    basket = [] # 바구니 스택
    for move in moves:
        for i in board:
            if i[move-1] != 0: # 인형이 있다면
                basket.append(i[move - 1])  # 바구니에 넣는다.
                i[move - 1] = 0  # 인형 빼고 빈칸으로 만들어준다.
                # print("before",basket)
                if len(basket) > 1:
                    if basket[-1] == basket[-2]: # 바구니 위에 같은 인형 2개 연속하면
                        answer += 2
                        basket.pop() # 연속한 인형 두개 pop()
                        basket.pop()
                break
    return answer

풀이

moves 배열에 있는 (수-1) 번째 열의 board 값 비교한다.

그곳에 인형이 있다면 그 인형을 바구니에 넣어준다.

바구니에는 연속해서 2개 같은 인형이 있으면 둘 다 삭제해주고 answer+=2 해준다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

def solution(numbers, hand):
    answer = ''
    left_finger = 10 # 왼손 처음 * 위치
    right_finger = 12 # 오른손 처음 #위치, 0은 11로 변경하기
    
    for n in numbers:
        if n in [1,4,7]: # 왼손 영역
            answer += 'L'
            left_finger = n
        elif n in [3,6,9]: # 오른손 영역
            answer += 'R'
            right_finger = n
            
        else: # 2 5 8 0 일 때
            if n == 0: # 0은 11로
                n = 11
            
            # 왼손과 오른손과 눌러야 할 n 거리를 각각 구해준다.
            left_dis = abs(n-left_finger)
            right_dis = abs(n-right_finger)
            left_dis = left_dis//3 + left_dis%3
            right_dis = right_dis//3 + right_dis%3
            # print("l",left_dis)
            # print("r",right_dis)
            if left_dis == right_dis: # 눌러야 할 거리가 왼손 오른손이 같으면 손잡이대로
                if hand == "right": # 오른손 잡이는 오른손
                    answer += 'R'
                    right_finger = n
                if hand == "left": # 왼손 잡이는 왼손
                    answer += 'L'
                    left_finger = n

            elif left_dis < right_dis: # 왼손과 거리가 더 가까우면 왼손
                answer += 'L'
                left_finger = n
            else: # 오른손이 더 가까우면 오른손
                answer += 'R'
                right_finger = n

    return answer

풀이 1

2, 5, 8, 0 일 때 거리를 구하는 것에서 쫌 헷갈렸다.

처음에 abs(현재 손가락//3 -눌러야 할 손가락//3) + abs(현재 손가락%3 -눌러야 할 손가락%3) 이렇게 풀었더니 틀려서 규칙을 다시 찾았다.

 

abs(현재 손가락-눌러야 할 손가락)를 먼저 구해주고

이 값에서 3으로 나눈 값과 3으로 나눈 나머지를 더해줘서 비교해야 하는 것이었다.


def solution(numbers, hand):
    answer = ''
    left_finger = '*' # 왼손 처음 * 위치
    right_finger = '#' # 오른손 처음 #위치
    phone_num = {1 : (0,0), 2 : (0,1), 3 : (0,2),
                 4: (1, 0), 5: (1, 1), 6: (1, 2),
                 7: (2, 0), 8: (2, 1), 9: (2, 2),
                 '*': (3, 0), 0: (3, 1), '#': (3, 2)}

    for n in numbers:
        if n in [1,4,7]: # 왼손 영역
            answer += 'L'
            left_finger = n
        elif n in [3,6,9]: # 오른손 영역
            answer += 'R'
            right_finger = n

        else: # 2 5 8 0 일 때
            # 왼손과 오른손과 눌러야 할 n 거리를 각각 구해준다.
            cur = phone_num[n]
            left_cur = phone_num[left_finger]
            right_cur = phone_num[right_finger]
            left_dis = abs(cur[0]-left_cur[0]) + abs(cur[1]-left_cur[1])
            right_dis = abs(cur[0]-right_cur[0]) +  abs(cur[1]-right_cur[1])

            if left_dis == right_dis: # 눌러야 할 거리가 왼손 오른손이 같으면 손잡이대로
                if hand == "right": # 오른손 잡이는 오른손
                    answer += 'R'
                    right_finger = n
                if hand == "left": # 왼손 잡이는 왼손
                    answer += 'L'
                    left_finger = n

            elif left_dis < right_dis: # 왼손과 거리가 더 가까우면 왼손
                answer += 'L'
                left_finger = n
            else: # 오른손이 더 가까우면 오른손
                answer += 'R'
                right_finger = n

    return answer

풀이 2

핸드폰의 버튼의 좌표를 정해서 딕셔너리로 관리해줬다.

더 직관적이고 깔끔한 것 같다.

728x90

https://programmers.co.kr/learn/courses/30/lessons/72410

출처 : 프로그래머스

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

def solution(new_id):
    answer = ''
    # 1단계 모든 대문자를 소문자로
    new_id = new_id.lower()
    id_must = ['-','_','.']

    # 2단계 알파벳 소문자, 숫자, 필요한 기호 빼고 삭제
    for i in new_id:
        if i in id_must or i.isalpha() or i.isdigit():
            answer += i

    # 3단계 연속된 . 하나의 .로
    cnt = 0
    for i in answer:
        if i == id_must[2]:
            cnt += 1
            if cnt == 2:
                answer = answer.replace("..", ".")
                cnt = 0

    # 4단계 .가 처음이나 마지막이면 제거
    if answer[0] == id_must[2]: # 처음
        if len(answer)>1: # 지울게 있어야 지움
            answer = answer[1:]
        else:
            answer = '.'
            
    if answer[-1] == id_must[2]: # 마지막
        answer = answer[:-1]

    # 5단계 빈 문자열이라면 a삽입
    if answer == "":
        answer += 'a'

    # 6단계 아이디 길이가 16자리 이상이면, 첫 15개 제외한 나머지 문자 제거
    if len(answer) >= 16:
        answer = answer.replace(answer[15:],"")
        if answer[-1] == id_must[2]: # 제거 후 마지막에 .이 있다면 제거
            answer = answer[:-1]

    # 7단계 아이디 길이가 2자 이하면 마지막 문자를 길이가 3될 떄까지 반복
    while len(answer) < 3:
        answer += answer[-1]
    # print(answer)
    return answer

풀이

문자열 단계별 구현만 해주면 된다.

 

참고로 3단계는 이렇게 while 문으로도 가능하다.

while '..' in answer:
        answer = answer.replace('..', '.')

정규식으로 푸는 방법도 존재한다.

 

728x90

https://programmers.co.kr/learn/courses/30/lessons/81301

출처 : 프로그래머스

 

코딩테스트 연습 - 숫자 문자열과 영단어

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

programmers.co.kr

def solution(s):
    word = ['zero','one','two','three','four','five','six','seven','eight','nine']
    answer = ""
    alp = ""
    for i in s:
        if i.isdigit(): # 숫자인지
            answer += i
        else:
            alp += i
            if alp in word:
                answer += str(word.index(alp))
                alp = ""

    return int(answer)

풀이 1

숫자면 그냥 답에 추가해준다.

숫자가 아니라면 영문자 문자열에 넣다가 word에 저장해둔 값과 같은 값이 나온다면 word의 인덱스를 답에 넣어주고 영문자 리셋 ""한다.


def solution(s):
    words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

    for i in range(len(words)):
        s = s.replace(words[i], str(i))

    return int(s)

풀이 2

이건 다른 사람들 풀이이다..

replace를 썼다..

ㅠㅠ 대단한 사람들..

 


2021 카카오 채용연계형 인턴쉽 코딩테스트 문제다. 

728x90

출처 : 프로그래머스

 

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

def solution(lottos, win_nums):
    ranking = [6, 6, 5, 4, 3, 2, 1] # 순위가 인덱스인 일치하는 개수 배열
    cnt = 0 # 당첨 개수
    for i in lottos:
        if i in win_nums:
            cnt += 1
    count0 = lottos.count(0) # 0 의 개수

    return [ranking[cnt+count0], ranking[cnt]]

풀이1

로또번호와 일치하는 개수 배열 ranking  : 순위를 인덱스로 한다.

 

def solution(lottos, win_nums):
    rank = {
        0: 6,
        1: 6,
        2: 5,
        3: 4,
        4: 3,
        5: 2,
        6: 1
    }
    return [ rank[len(set(lottos) & set(win_nums)) + lottos.count(0)], rank[len(set(lottos) & set(win_nums))]]

풀이2

딕셔너리를 활용한다.

두 배열의 공통값을 빠르게 구하는 방법

set(list1) & set(list2)

+ Recent posts