코딩테스트

[25.12.12 코테(Python)]-아이스 아메리카노&핸드폰 번호 가리기&영어 끝말잇기

지니248 2025. 12. 12. 15:27

Lv0. 아이스 아메리카노 (Python)

링크:  코딩테스트 연습 - 아이스 아메리카노 | 프로그래머스 스쿨

 

내가 작성한 코드

def solution(money):
    return list(divmod(money, 5500))

 

새로 배운 코드

def solution(money):
    return list(divmod(money, 5500))

# divmod -> (몫, 나머지)를 한번에 구하는 함수
# 문제 출력 형식이 리스트이므로 list()로 변환

Lv1. 핸드폰 번호 가리기 (Python)

링크: 코딩테스트 연습 - 핸드폰 번호 가리기 | 프로그래머스 스쿨

 

내가 작성한 코드

def solution(phone_number):
    stars = '*' * (len(phone_number) -4)
    last = phone_number[-4:]
    return stars + last

 

새로 배운 코드

def solution(phone_number):
    return '*' * (len(phone_number)-4) + phone_number[-4:]

# return문으로 곧장 쓸 수 있다
# '*' * (len(phone_number)-4) -> 전체 길이에서 뒤 4자리를 제외한 앞자리를 *로 가림
# phone_number[-4:] -> 전화번호 뒤 4자리만 슬라이싱하여 그대로 노출
# [:-4] -> 뒤에서 4개를 제외한 앞부분 전체를 가져옴

Lv2. 영어 끝말잇기 (Python)

링크: 코딩테스트 연습 - 영어 끝말잇기 | 프로그래머스 스쿨

 

내가 작성한 코드

# 현재단어: current_word
# 이전단어: prev_word

def solution(n, words):
    used_words = set() # set(집합)을 사용했으므로 add 사용 -> 동일한 단어를 중복 저장하지 않아 중복 체크에 최적화
    # used_words = [] -> 리스트형이면 append 사용
    
    for i in range(len(words)): # 단어를 인덱스로 접근하며 반복(번호/차례 계산)
        current_word = words[i] # i번째 단어를 현재 단어로 설정
        
        if i > 0: # i가 0보다 크면(첫 단어가 아니라면)
            prev_word = words[i-1] # 이전 단어를 저장
            
            if prev_word[-1:] != current_word[:1]: # 이전 단어의 마지막 글자와 현재 단어의 첫 글자가 다르다면
                return [(i%n)+1, (i//n)+1]
            
            if current_word in used_words: # 현재 단어가 사용한 단어에 있다면
                return [(i%n)+1, (i//n)+1]
            
        used_words.add(current_word) # 현재 단어를 사용한 단어 목록에 추가한다
        
    return [0,0] # 문제 없이 끝남

# [(i%n)+1, (i//n)+1] -> [번호, 차례]
# (i%n)+1 -> i번째 단어를 말한 사람의 번호
#            %n은 i번째의 단어가 어느 사람 차례인지를 0~(n-1) 사이의 숫자로 순환
#            따라서 실제 사람 번호가 되도록 +1
# (i//n)+1 -> 그 사람이 말한 차례
#             n개 단어마다 한 번씩 라운드가 증가함
#             몫에 +1을 해 1번째부터 시작하도록

 

새로 배운 코드

# 현재단어: words[i]
# 이전단어: words[i-1]

def solution(n, words):
    # i는 1부터 시작(0번째 단어는 이전 단어가 없으므로 검사가 불필요함)
    for i in range(1, len(words)):
        
        # 조건 1: 이어 말하기 규칙 위반 검사
        # words[i][0] -> 현재 단어의 첫글자
        # words[i-1][-1] -> 이전 단어의 마지막 글자
        
        # 조건 2: 중복 단어 검사
        # words[:i] -> 지금까지 나온 모든 단어 리스트 (0 ~ i-1)
        # words[i] in words[:i] -> 현재 단어가 이전에 이미 등장했는지 확인
        if words[i][0] != words[i-1][-1] or words[i] in words[:i]: 
            
            # 위 풀이 참고
            return [(i%n)+1, (i//n)+1]
        
    return [0,0]