[Algorithm🧬] 로또 최고 순위와 최저 순위, 숫자 문자열 게임, 인형 뽑기

또상·2021년 11월 16일
0

Algorithm

목록 보기
1/133
post-thumbnail

프로그래머스 level 1

1. 로또 최고 순위와 최저 순위

문제 링크 / 풀이.py, 풀이.swift


# 순위 계산 함수. 
# 6개 1등 5개 2등 ... 1개 이하로 맞으면 6등
def calculate_order(count):
    if count <= 1:
        return 6
    else:
        return 7-count


def solution(lottos, win_nums):
    answer = []
    match_count = 0
    zero_count = 0
    high_order = 0
    low_order = 0
    
    # 먼저 맞은 번호 개수를 센다.
    for num in win_nums:
        for lotto in lottos:
            if num == lotto:
                match_count += 1
    
    # 모르는 번호의 개수를 샌다.
    for lotto in lottos:
        if lotto == 0:
            zero_count += 1
    
    # 모르는 번호도 다 맞았을 때가 순위가 가장 높다
    high_order = calculate_order(match_count+zero_count)
    # 모르는 번호가 다 틀리면 가장 낮은 순위.
    low_order = calculate_order(match_count)
        
    answer.append(high_order)
    answer.append(low_order)
    
    return answer

2. 숫자 문자열 게임

문제 링크 / 풀이.py ,풀이.swift

# 문자열을 넣어서 숫자 이름이면 숫자로 변환해주는 함수.
def change_string_to_num(s):
    if s == 'zero':
        return 0
    elif s == 'one':
        return 1
    elif s == 'two':
        return 2
    elif s == 'three':
        return 3
    elif s == 'four':
        return 4
    elif s == 'five':
        return 5
    elif s == 'six':
        return 6
    elif s == 'seven':
        return 7
    elif s == 'eight':
        return 8
    elif s == 'nine':
        return 9
    else:
        return 10

def solution(s):
    answer = 0
    local = ''
    
    # 들어온 문자열을 한 글자씩 읽는다.
    # 숫자라면 바로 숫자로 변환해서 뒤에 붙이고, 문자라면 해당 문자가 숫자의 이름일 때까지 읽은 후 숫자로 변환해서 붙인다.
    for c in s:
        if c.isdecimal():
            # 숫자 앞이 숫자 이름이었다면 해당 문자열도 문자로 변환해서 붙이고 넣어야함.
            if local != '': 
                answer *= 10
                answer += change_string_to_num(local)
                local = ''
            
            answer *= 10
            answer += int(c)
            
        else: #문자라면
            local += c
            # 문자열이 숫자 이름이 될 때, 붙인다.
            if change_string_to_num(local) != 10:
                answer *= 10
                answer += change_string_to_num(local)
                local = ''
	
    # 만약 마지막이 문자열로 끝난다면, 마지막 숫자 이름을 붙여줘야 한다.
    if change_string_to_num(local) != 10:
        answer *= 10
        answer += change_string_to_num(local)

    return answer

처음에 False 대신 0을 줬더니 zero가 들어간 구문들에서 0이 안찍히는 문제 발생. 파이썬에서는 True 1 False 0 이 안되는 줄 알았는데, 3.0 ver 부터 된다고 한다..

C언어 사고방식을 가지고 python을 공부했다가 swift를 공부하니까... dictionary 같은 아름다운 기능들을 잘 못 써먹는게 아쉽다. 이것도 dictionary로 바꾸면 더 쉽게 구현할 수 있었을듯..!

swift로 풀 때는 dictionary를 이용해서 풀었다. String() Int() 의 결과값이 역시나.. Int? 이라서 오류를 엄청 만났다....


3. 인형 뽑기

문제 링크 / 풀이.py ,풀이.swift

def solution(board, moves):
    answer = 0
    stck = []
    
    for move in moves:
        for i in range(len(board)):
            # 하나의 열 안에서 움직이기 때문에 move 는 뒤에!
            item = board[i][move-1]
            board[i][move-1] = 0
            # 인형이 있는 곳까지 내려가서 뽑고 스택에 넣고 계산
            if item != 0:
                # 스택이 비어있으면 넣고
                if len(stck) == 0:
                    stck.append(item)
                # 비어있지 않으면
                else:
                    # 마지막 아이템과 같은지 확인하고 넣는다.
                    if stck[-1] == item:
                        stck.pop()
                        answer += 2
                    else:
                        stck.append(item)
                
                # 인형은 하나만 뽑으면 되니 break
                break
    
    return answer

stack을 이용하는 문제였다! 로직은 쉬웠는데 머릿속에서 swift 문법이랑 짬뽕되어서... 0..<list.count 하던 버릇이 들어서...... len(list) 대신 list.count 찍다가 type error 20번쯤 봤다...

swift로 풀 때는... popLast() 의 Return 속성이 Element? 라서 많은 오류를 만났다.... 대신 if let 구문으로 optional chaining을 쓸 수 있었다.

profile
0년차 iOS 개발자입니다.

0개의 댓글