본문 바로가기
알고리즘 문제 풀이/Programmers

[3회차]

by 중앙백 2021. 12. 6.

Programmers Level.1 최소직사각형

def solution(sizes):
    w = 0
    h = 0
    for size in sizes:
        size.sort()
        if size[1] > w:
            w = size[1]
        if size[0] > h:
            h = size[0]
    return w * h

 - 내가 생각한 풀이.

 - 이후 다른 사람의 풀이를 보니까 이걸 더 간단하게 구현하더라. 주어진 명함 사이즈의 긴 쪽 중에서 최대값을 찾고 짧은 쪽에서 최대값을 찾는 방식. 본질적으로는 나와 같은 방식이나 아래 풀이가 좀 더 문제의 본질을 파악한 듯.

def solution(sizes):
    return max(max(x) for x in sizes) * max(min(x) for x in sizes)

 

 

 

Programmers Level.1 나머지가 1이 되는 수 찾기

def solution(n):
    answer = 1
    while True:
        if n % answer == 1:
            return answer
        answer += 1

 

 

 

Programmers Level.1 부족한 금액 계산하기

def solution(price, money, count):
    payment = 0
    for i in range(1, count + 1):
        payment += price * i
    if payment <= money:
        return 0
    else:
        return payment - money

 

 

 

Programmers Level.1 비밀지도

def solution(n, arr1, arr2):
    answer = [''] * n
    str1 = []
    str2 = []
    for i,j in zip(arr1, arr2):
        str1.append(str(bin(i))[2:].zfill(n))
        str2.append(str(bin(j))[2:].zfill(n))
    for i in range(n):
        for j in range(n):
            if str1[i][j] == '1' or str2[i][j] == '1':
                answer[i] += '#'
            else:
                answer[i] += ' '
    return answer

 - 이진수로 바꾼다음 문자열을 활용한 연산을 했으나, 문제 해설을 보니 비트 연산을 묻고자 하는 의도였다고 한다.

 

def solution(n, arr1, arr2):
    answer = []
    str_a = ''
    for i, j in zip(arr1, arr2):
        str_a = str(bin(i|j)[2:])
        str_a = str_a.rjust(n,'0')
        str_a = str_a.replace('0', ' ')
        str_a = str_a.replace('1', '#')
        answer.append(str_a)
    return answer

 - 비트 연산을 참고해서 다음과 같이 작성했다. zfill말고도 rjust라는 함수도 존재했다. 0이 아닌 다른 문자도 채워넣을 수 있다는 장점이 존재.

 

 

 

Programmers Level.1 가운데 글자 가져오기

def solution(s):
    m = len(s)
    if m % 2 == 0:
        return s[m//2-1: m//2+1]
    else:
        return s[m//2]

 

 

 

Programmers Level.1 다트 게임

def solution(dartResult):
    array = [0, 0, 0]
    j = -1
    dartResult = dartResult.replace('10', 'A')
    for i in dartResult:
        if i in '0123456789':
            j += 1
            array[j] += int(i)
        if i == 'A':
            j += 1
            array[j] += 10
        if i == 'D':
            array[j] **= 2
        if i == 'T':
            array[j] **= 3
        if i == '*':
            array[j] *= 2
            if j >= 1:
                array[j - 1] *= 2
        if i == '#':
            array[j] *= -1
    return sum(array)

 - 10이라는 숫자를 어떻게 인식할 수 있을지 고민했고 사용되지 않는 알파벳A로 바꿔서 인식해서 문제 해결.

 *** 정규식을 이용해서 문제를 풀 수 있더라. 이따 풀어봐야지..

 

 

 

 Programmers Level.1 같은 숫자는 싫어

def solution(arr):
    answer = []
    for i in arr:
        if not answer: answer.append(i)
        if answer[-1] == i:
            continue
        answer.append(i)
    return answer

 

 

 

Programmers Level.1 나누어 떨어지는 숫자 배열

def solution(arr, divisor):
    answer = []
    for i in arr:
        if i % divisor == 0:
            answer.append(i)
    if not answer:
        return [-1]
    else:
        answer.sort()
        return answer

 

 

 

Programmers Level.1 두 정수 사이의 합

def solution(a, b):
    answer = 0
    if a > b:
        a, b = b, a
    for i in range(a, b + 1):
        answer += i
    return answer

 

 

 

Programmers Level.1 문자열 내 마음대로 정하기

def solution(strings, n):
    answer = []
    dicts = dict()
    for string in strings:
        dicts[string] = string[n]
    lists = sorted(dicts.items(), key= lambda x: (x[1], x[0]))
    for i in lists:
        answer.append(i[0])
    return answer

 - 아이디어는 사전 자료형을 이용. 처음에는 n번 째 문자를 키로 설정해 키를 기준으로 설정하면 된다고 생각했는데 키 하나당 하나의 Value만 들어가게 되어 있어서 같은 키를 가진 두 개의 value를 넣을 수 없었다. 그래서 반대로 n번째 문자를 value에 넣고 전체 단어를 key에 넣기로 함. 그리고 sorted를 이용해 value를 기준으로 정렬. 정렬 우선순위는 1) value 2) key로 해서 정렬했다.

 - 다른 사람들의 풀이를 참고해서 아래와 같이 개선.

def solution(strings, n):
    return sorted(strings, key=lambda x: (x[n],x))

 - 문자열 자체를 sorted함수를 이용해 바로 정렬했다. 우선순위는 1) n번째 글자 2) 문자열 전체.

 

 

 

Programmers Level.1 문자열 내 p와 y의 개수

def solution(s):
    cnt = 0
    s = s.lower()
    for i in s:
        if i == 'p':
            cnt += 1
        if i == 'y':
            cnt -= 1
    if cnt == 0:
        return True
    return False

 

 

 

Programmers Level.1 문자열 내림차순으로 배치하기

def solution(s):
    answer = []
    for i in s:
        answer.append(ord(i))
    answer.sort(reverse=True)
    strs = ''
    for i in answer:
        strs += str(chr(i))
    return strs

 

 

 

Programmers Level.1 문자열 다루기 기본

def solution(s):
    if len(s) == 4 or len(s) == 6:
        for i in s:
            if i not in '0123456789':
                return False
        return True
    return False

아래는 다른 사람의 풀이

def solution(s):
    return s.isdigit() and len(s) in (4,6)

 - s의 길이가 4또는 6이다를 좀 더 짧게 적을 수 있구나!

 

 

 

Programmers Level.1 서울에서 김서방 찾기

def solution(seoul):
    for i, j in enumerate(seoul):
        if j == 'Kim':
            return "김서방은 "+ str(i) +"에 있다"

 

 

 

Programmers Level.1 소수 찾기

def solution(n):
    array = list(range(2, n + 1))
    for i in range(2, int(n**0.5) + 1):
        j = 2
        while i * j <= n:
            if i * j in array:
                array.remove(i * j)
            j += 1
    return len(array)

 - 처음에 푼 방식. 틀렸다.  정확성 테스트 10,11,12 와 효율성 테스트 실패. 수학적 아이디어 자체에서는 문제 없었다고 생각했고 구현하는 방식이 잘못됐다고 생각했다. 전에 remove가 효율적이지 못하다는 말을 들었던 것 같아서 이걸 DP에서 배웠던 메모이제이션 기법으로 해결.

def solution(n):
    array = [1] * (n + 1)
    array[0] = 0
    array[1] = 0
    for i in range(2, int(n**0.5) + 1):
        j = 2
        while i * j <= n:
            if array[i * j] == 1:
                array[i * j] = 0
            j += 1
    return sum(array)

 맞았다

 

def solution(n):
    num=set(range(2,n+1))

    for i in range(2,n+1):
        if i in num:
            num-=set(range(2*i,n+1,i))
    return len(num)

다른 풀이를 참고하니 집합 개념으로도 풀 수 있더라.

 

 

 

Programmers Level.1 수박수박수박수박수?

def solution(n):
    answer = ''
    for i in range(n):
        if i % 2 == 0:
            answer += '수'
        else:
            answer += '박'
    return answer

 

 

 

Programmers Level.1 문자열을 정수로 바꾸기

def solution(s):
    if s[0] == '+':
        return int(s[1:])
    if s[0] == '-':
        return -int(s[1:])
    else:
        return int(s)

 

 

 

Programmers Level.1 시저 암호

def solution(s, n):
    answer = ''
    upper_list = ['A','B','C','D','E','F',
                  'G','H','I','J','K','L','M',
                  'N','O','P','Q','R','S','T',
                  'U','V','W','X','Y','Z']
    lower_list = ['a','b','c','d','e','f',
                  'g','h','i','j','k','l','m',
                  'n','o','p','q','r','s','t',
                  'u','v','w','x','y','z']
    for i in s:
        if i in upper_list:
            a = upper_list.index(i)
            a += n
            a %= 26
            answer += upper_list[a]
        elif i in lower_list:
            a = lower_list.index(i)
            a += n
            a %= 26
            answer += lower_list[a]
        else:
            answer += ' '
    return answer

 

 

 

Programmers Level.1 약수의 합

def solution(n):
    if n == 0:
        return 0
    answer = 0
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            if i == int(n** 0.5):
                answer += i
            else:
                answer += i + n//i
    return answer

 

 

 

Programmers Level.1 이상한 문자 만들기

def solution(s):
    a = s.split(" ")
    print(a)
    answer = ''
    for i in a:
        for j in range(len(i)):
            if j % 2 == 0:
                answer += i[j].upper()
            else:
                answer += i[j].lower()
        answer += ' '
    return answer[:-1]

 - 상당히 시간 걸린 문제. 공백이 여러개인걸 구분하면서 하고 싶으면 split()이 아니라 split(' ')로 해야 했다!

 

 

 

Programmers Level.1 자릿수 더하기

def solution(n):
    answer = 0
    while n > 0:
        answer += n % 10
        n //= 10
    return answer

 

 

 

Programmers Level.1 자연수 뒤집어 배열로 만들기

def solution(n):
    answer = list(map(int,list(str(n))[::-1]))
    return answer

 

 

 

Programmers Level.1 정수 내림차순으로 배치하기

def solution(n):
    a = sorted(list(map(int, list(str(n)))), reverse=True)
    a = ''.join(map(str, a))
    return int(a)

 - int -> str -> int -> str -> int 라는 복잡한 과정을 거쳤다. 근데 다른 사람의 풀이를 보니까 그냥 str형도 정렬시킬 수 있더라.

def solution(n):
    a = sorted(list(str(n)), reverse=True)
    return int(''.join(a))

 

 

 

 

*** 네이버 부스트캠프 시험 날이 얼마 남지 않아서 문제의 답만 적고 있는데, 나중에는 답만 적지 말고 좀 더 자세하게 포스팅 해야 겠다. 

'알고리즘 문제 풀이 > Programmers' 카테고리의 다른 글

[6회차]  (0) 2021.12.09
[5회차]  (0) 2021.12.08
[4회차]  (0) 2021.12.07
[2회차]  (0) 2021.12.05
[1회차]  (0) 2021.12.04

댓글