[코테스터디 1주차] 프로그래머스 문제 | 옹알이(1), 평행, 신고결과받기, 문자열 나누기, 달리기 경주

soyyeong·2023년 8월 11일
0

코테

목록 보기
4/6

1. 옹알이(1)


def solution(babbling):
    CANWORDS = ["aya", "ye", "woo", "ma"]
    for i in range(len(babbling)):
        while True:
            try:
                found_word_bool = [can_word in babbling[i] for can_word in CANWORDS]
                babbling[i] = babbling[i].replace(CANWORDS[found_word_bool.index(True)], '0')
            except:
                break
                
    bool_list = [word.isdigit() for word in babbling]
    return bool_list.count(True)

2. 평행


def solution(dots):
    answer = 0
    if slope(dots[0],dots[1]) == slope(dots[2],dots[3]):
        answer = 1
    if slope(dots[0],dots[2]) == slope(dots[1],dots[3]):
        answer = 1
    if slope(dots[0],dots[3]) == slope(dots[1],dots[2]):
        answer = 1
    return answer

def slope(dot1,dot2):
    return (dot2[1] - dot1[1] ) / (dot2[0] - dot1[0]) # 기울기 계산 (y축 차이 - x축 차이)

얘는 풀기 싫어서 코드 찾아봤다.
slope() 라는 함수 쓰면 쉽게 풀 수 있었다.

3. 신고결과받기


def solution(id_list, report, k):
    # duplicate
    report = list(set(report))
    
    report_list = []
    for i in report:
        report_list.append(i.split(' '))
        
    singo_dict = dict.fromkeys(id_list, 0)
    for i in report_list:
        singo_dict[i[1]] += 1
        
    stop_id = [key for key, value in singo_dict.items() if value >= k]
    
    result = dict.fromkeys(id_list, 0)
    for report in report_list:
        if report[1] in stop_id:
            result[report[0]] += 1
        else:
            pass
        
    answer = list(result.values())
    return answer

이 문제가 젤 쉬웠다.

4. 문자열 나누기

def solution(s):
    i, x_count, notx_count = 0, 0, 0
    split_list = []
    
    while i < len(s):
        x = s[0]
        if s[i] == x:
            x_count += 1
        else:
            notx_count += 1
            
        i += 1
        
        if x_count == notx_count:
            split_list.append(s[:i])
            s = s[i:]
            i = 0
            
    if s != '':
        split_list.append(s)
        
    answer = len(split_list)
    return answer

5. 달리기 경주

시간초과 코드

for call in callings:
  idx = players.index(call)
  players[idx-1], players[idx] = players[idx], players[idx-1]
  • 이렇게 하니까 시간초과가 나왔다. player 리스트에서 .index() 함수를 써서 인덱스 번호를 얻는 부분이 오래 걸리는 것 같다.

정답 코드

def solution(players, callings):
    rank_dict = {player : rank for rank, player in enumerate(players)}
    for call in callings:
        idx = rank_dict[call]
        rank_dict[call] -= 1
        rank_dict[players[idx-1]] += 1
        players[idx-1], players[idx] = players[idx], players[idx-1]
    return players

rank_dict라는 딕셔너리를
{‘mumu’ : 0, 'seo' : 1, 'poe' : 2} 이런식으로 만들어서 인덱스를 저장하고 써서 시간을 단축할 수 있다!

그리고 저렇게 인덱스 번호로 바꾸는 걸 SWAP이라고 한다.
이 문제 풀면서 처음 알았다.

0개의 댓글