본문 바로가기
Programming/Python

연습문제: 하샤드 수, 콜라츠 추측 / 스택,큐: 올바른 괄호

by 3n952 2023. 5. 5.

https://school.programmers.co.kr/learn/courses/30/lessons/12947

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스 1단계 수준의 문제를 풀었다.

언어는 파이썬!

 

- 문제 1: 하샤드 수

문제 설명: 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

 

양의 정수 x를 x의 자릿수의 합으로 나눴을 때 나머지가 0이면 된다.

문제를 보자마자 파이썬의 자료형을 바꿔서 자릿수를 표현해야겠다고 생각했다.

int -> str -> list => 각 자리별 숫자가 list에 append되는 것과 같다.

def solution(x):
    answer = True
    list_x = list(str(x))
    sum_x = 0
    for i in range(len(list_x)):
        sum_x += int(list_x[i])
    
    if x % sum_x != 0:
        answer = False
    return answer

 

-문제2: 콜라츠 추측

문제 설명: 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 

 

for문과 if문을 적절히 사용하면 될 것 같다고 판단하여 코드를 작성하였다. 

def solution(num):
    answer = 0
    if num == 1:
        answer = 0
        
    for i in range(1,501):
        if num % 2 ==0 and num >1:
            num = num / 2
            answer = i
        elif num % 2 != 0 and num >1:
            num = num * 3 + 1
            answer = i
            
    if num != 1:
        answer = -1
            
                
    return answer

for문에서 조건에 맞게 코드가 수행됐을 때 수행된 만큼(i)을 반환하고 최종num이 1이 아니면 -1을 반환하게 했다.

 

-문제 3: 올바른 괄호

문제 설명: 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

처음에 그냥 안될 것 같은 조건만 판단해서 False를 반환하면 될 줄 알았다..

#첫시도 

def solution(s):
    answer = True
    s_list = list(s)
    if s[0] == ')':
        answer = False
    else:
        if s_list.count('(') != s_list.count(')'):
            answer = False
    return answer

그런데 다음과 같이 실패한 테스트가 생겼다.. 

왜 안되는지는 잘 모르겠다..

 

그래서 보다 직관적인 방식으로 코드를 수정했다.

스택 구조를 이용하여

 

1. '('가 들어오는 경우

  • '(', '(' 와 같이 중복되는 경우

2.')'가 들어오는 경우

  • '('가 앞에 있어 ')'가 들어오면 처리되는 경우

로 판단하여 코드를 작성해보았다.

def solution(s):
    answer = True
    s_stack = []
    for v in s:
        if v == '(':
            s_stack.append(v)
        else:
            if s_stack == []:
                answer = False
            else:
                s_stack.append(v)
                s_stack.pop()
                s_stack.pop(-1)
                
    if s_stack != []:
        answer = False
        
                
    return answer