Algorithm/programmers/level1/210614/6문제 (with python)

yellow·2021년 6월 14일
0

알고리즘 문제

목록 보기
38/58

2021년 6월 14일

프로그래머스에서 푼 level1 10문제 모음집입니다.
문제 풀이에 대한 설명은 코드에 주석으로 표시하였습니다.

📖 문제1 : 문자열을 정수로 바꾸기

⌨ 코드

def solution(s):
    # 첫 글자가 '-'부호가 아니면 바로 int(s) 리턴
    # 첫 글자가 '-'부호이면 부호를 뺀 나머지 숫자 문자열을 정수형으로 바꾸고 -1 곱하기
    return int(s) if s[0] != '-' else int(s[1:]) * (-1)

int(x = 0), int(x, base=10)

  • 전달 받은 매개변수 x(문자열)를 정수형으로 바꾸어준다.
  • 매개변수 base는 진법을 나타낸다. -> x를 base진법으로 읽어서 해당 숫자에 맞는 10진수로 변환해서 return
  • x가 문자열일 때 부호도 알아서 인식해서 정수형으로 바꾸어준다.
print(int('150')) # 150
print(int('-150')) # -150
print(int('1111', 2)) # 15

📖 문제2 : 시저 암호

⌨ 코드

def solution(s, n):
    answer = []
    # 소문자를 모두 담은 리스트
    lower = [chr(a) for a in range(97, 123)]
    # 대문자를 모두 담은 리스트
    upper = [chr(a) for a in range(65, 91)]

    for a in s:
        # 소문자라면,
        if a.islower():
            # n만큼 밀었을 때 'z'를 넘어가는 경우
            if 122 < ord(a) + n:
                answer.append(lower[ord(a) + n - 123])
            else:
                answer.append(lower[ord(a) + n - 97])
        # 대문자라면,
        elif a.isupper():
            # n만큼 밀었을 때 'Z'를 넘어가는 경우
            if 90 < ord(a) + n:
                answer.append(upper[ord(a) + n - 91])
            else:
                answer.append(upper[ord(a) + n - 65])
        # 공백이라면,
        elif a.isspace():
            answer.append(' ')
            
    # 리스트를 문자열로 만들어서 리턴
    return ''.join(answer)

⌨ 코드 -> 더 간결한 코드

  • n만큼 밀었을 때 'z'/'Z'를 넘어가는 경우와 넘어가지 않는 경우 모두를 처리할 수 있는 연산을 사용
def solution(s, n):
    answer = []
    # 소문자를 모두 담은 리스트
    lower = [chr(a) for a in range(97, 123)]
    # 대문자를 모두 담은 리스트
    upper = [chr(a) for a in range(65, 91)]
    
    for a in s:
        # 소문자라면,
        if a.islower():
            answer.append(lower[(ord(a) - ord('a') + n) % 26])
        # 대문자라면,
        elif a.isupper():
            answer.append(upper[(ord(a) - ord('A') + n) % 26])
        # 공백이라면,
        elif a.isspace():
            answer.append(' ')
            
    # 리스트를 문자열로 만들어서 리턴
    return ''.join(answer)

📖 문제3 : 약수의 합

⌨ 코드

def solution(n):
    answer = 0
    # 1 ~ n까지
    for i in range(1, n+1):
        # n을 i로 나누었을 때 나누어 떨어지면 약수
        if n % i == 0:
            answer += i
    return answer

📖 문제4 : 이상한 문자 만들기

⌨ 코드

def solution(s):
    answer = ''
    n = 0 # 단어별 인덱스 짝/홀수 판단을 위한 변수
    for i in range(len(s)):
        # 공백이면
        if s[i].isspace():
            answer += ' '
            # 공백이 나왔으면 n을 초기화 시켜줘야한다.
            # for문 마지막에 n += 1을 해주기 때문에 -1로 할당
            n = -1
        else:
            # 단어 내에서 인덱스가 짝수인 경우
            if n % 2 == 0:
                answer += s[i].upper()
            # 단어 내에서 인덱스가 홀수인 경우
            else:
                answer += s[i].lower()    
        n += 1
    return answer

⌨ 코드 -> 다른 분의 코드

  • split()을 사용해서 단어들로 이루어진 리스트를 얻어서 문제를 푸셨다.
def toWeirdCase(s):
    res = []
    
    # 공백을 기준으로 단어별로 쪼개서 담은 리스트 순회
    for x in s.split(' '):
        word = '' # 공백이 연속으로 나오는 경우를 대비해서
        for i in range(len(x)):
            c = x[i].upper() if i % 2 == 0 else x[i].lower()
            word = word + c
        res.append(word)
    return ' '.join(res)

💡 새로 알게된 split(' ')

  • 만약 공백이 연속으로 나올 때 split(' ')은 문자열을 어떻게 인식할까
# 예시)
s = 'a   b' # a와 b사이에 공백 3개
print(s.split(' ')) # ['a', '', '', 'b']
  • 문자열 s를 문자 'a',(공백),'', (공백),'',(공백), 'b'으로 이루어져있는 것으로 인식한다.

📖 문제5 : 자연수 뒤집어 배열로 만들기

⌨ 코드

def solution(n):
    answer = list(map(int,list(str(n))))
    answer.reverse()
    return answer

💡 reversed() vs. reverse()

  • reversed()는 내장함수, reverse()는 list에서 제공하는 함수
  • reversed()는 원본을 변경하지 않지만, reverse()는 list 원본을 변경한다.
  • reversed()는 객체를 리턴하지만, reverse()는 아무것도 리턴하지 않는다.

📖 문제6 : 행렬의 덧셈

⌨ 코드

def solution(arr1, arr2):
    # 주어진 행렬의 행
    N = len(arr1)
    # 주어진 행렬의 열
    M = len(arr1[0])
    
    answer = [[] for _ in range(N)]
    # 인덱스 i,j로 직접 요소에 접근해서 덧셈
    for i in range(N):
        for j in range(M):
            answer[i].append(arr1[i][j] + arr2[i][j])
    return answer

⌨ 코드 -> 다른 분의 코드

  • 이 코드를 작성하기 위해 이 문제를 작성했다...너무 대단한 코드
def sumMatrix(A,B):
    answer = [[c + d for c, d in zip(a, b)] for a, b in zip(A,B)]
    return answer
  • 글로 설명하기 힘들어서 밑에 그림으로 설명을 적어두었다.

프로그래머스 level1 문제를 다 풀어보았다.
있는지도 몰랐던 새로운 메소드들도 많이 알게 되었고, 알고는 있었지만 숙지하지 못했던 메소드들을 다시금 머리에 새길 수 있는 좋은 시간이었다.

profile
할 수 있어! :)

0개의 댓글