본문 바로가기

알고리즘풀이/프로그래머스

[11/16] Lv1.

👉 사용 언어 : PYTHON3

비밀지도

✅ Solution

 

def solution(n, arr1, arr2):
    answer = []
    for i in range(n):
        arr1[i] = list(str(bin(arr1[i])[2:]).zfill(n))
        arr2[i] = list(str(bin(arr2[i])[2:]).zfill(n))
    for j in range(n):
        string = ''
        for k in range(n):
            if arr1[j][k] == arr2[j][k] == '0':
                string += ' '
            else:
                string += '#'
        answer.append(string)
    return answer

 

👉 아이디어

  • arr1 및 arr2 반복문 돌려서 이진수로 표현 > 둘 다 String 배열이 됨 ( 1: #, 0: 공백 )
  • arr1 및 arr2에서 각 String을 뽑아서 비교
  • 둘 다 공백이면 공백 ,  아니면 "#"

👉 bin() 사용하여 십진수를 이진수로 변환 ( 앞의 '0b' 제거 위해 문자열 슬라이싱 [2:] )

👉 변환한 이진수는 앞의 0은 빠지므로 0을 채워 자릿수를 n으로 맞춰주기 위해 zfill() 를 사용한다.

    "zfile(num)" : num은 만들고 싶은 자릿수를 넣어주면 됨

    "2".zfill(3) _ "002"  /  "4".zfil(2) _ "04"

👉 반복문 돌려서 arr1[][] == arr2[][] == '0' 이면 즉, 둘 다 공백이면 공백문자를 그렇지 않으면 '#"을 문자열에 추가한다.

👉 5개씩 묶어 표현한 스트링을 문자 리스트에 추가하여 반환한다.

 

 다른 사람 풀이 참고

 

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

 

👉 두 배열에서 동시에 값을 꺼내오려면 zip() 사용 _ 까먹지 말고 활용하자

명예의 전당(1)

✅ Solution

 

def solution(k, score):
    answer = []
    top = score[:k]
    for i in range(len(score)):
        if i < k:
            answer.append(min(score[:i+1]))
        else:
            if min(min(top), score[i]) in top:
                top.remove(min(top))
                top.append(score[i])
            answer.append(min(top))
    return answer

 

👉 아이디어

  • k개까지는 그냥 리스트에 저장한다. ( 문자열 슬라이싱 이용 score[:k] )
  • score 길이만큼 반복문을 돌린다.
    • index < k : 슬라이싱 을 사용하여 min값을 정답 리스트에 추가한다.
    • index >= k : top의 min값 < 새로운 값 이면 top에서 min값을 지우고 새로운 값을 추가한다.
  • 정답 리스트에 반복문을 실행할때마다 top의 min값을 추가한다.
  • 정답 리스트를 반환한다.

👉 반복문 안에서 i < k 일 경우, 슬라이싱할때 사용하는 인덱스 범위(?)에 주의해야 한다.

    ( 끝 인덱스는 포함되지 않으므로 +1 을 해주었다.  [:1], [:2], ..., [:k] )

 

 다른 사람 풀이 참고

 

def solution(k, score):

    q = []

    answer = []
    for s in score:

        q.append(s)
        if (len(q) > k):
            q.remove(min(q))
        answer.append(min(q))

    return answer

소수 찾기

✅ Solution

 

import math
def solution(n):
    answer = 0
    for i in range(3, n+1, 2):
        for j in range(2, int(math.sqrt(i))+1):
            if i % j == 0:
                answer += 1
                break
    return (math.ceil(n/2) -1) - answer + 1

 

👉 math 패키지를 사용하여 풀이함

  ✅ math.sqrt : 제곱근

  ✅ math.ceil : 올림

 

👉 2를 제외한 짝수는 모두 2를 약수로 가지므로 소수를 찾을 때 짝수는 제외하고 찾는다.

    : 1번째 반복문에서 3부터 n까지 +2씩 홀수에서만 실행한다.

👉 약수를 구해서 나열해보면 가운데 약수(= 해당 숫자의 제곱근)을 기준으로 대칭인것을 알 수 있다.

    : 2번째 반복문을 2부터 제곱근까지 실행한다.

👉 홀수에서 소수가 아닌 수는 answer 변수에 카운트한다.

👉 리턴값 _ ( 홀수 개수 -1 ) -answer +1

    : math.ceil(n/2) > 2로 나눈 값에서 올림한 값으로 홀수 개수를 의미

    ( 반올림은 .5의 경우 "사사오오의 법칙"에 의해 앞자리수가 짝수이면 내림, 홀수이면 올림하므로 올림을 선택하여 사용하였다. )

    : -1 > 1은 소수가 아니므로 뺴줌

    : -answer > 홀수 중 소수가 아닌 값을 빼줌

    : +1 > 2는 짝수이지만 소수이므로 더해줌

 

 다른 사람 풀이 참고

 

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)

소수 만들기

✅ Solution

 

from itertools import combinations
def solution(nums):
    answer = 0
    comb = list(combinations(nums, 3))
    for i in comb:
        i = sum(list(i))
        for j in range(2, int(i**(1/2))+1):
            if i % j == 0:
                answer += 1
                break
    return len(comb)-answer

 

👉 combination(조합) 및 위의 소수 찾는 방법 사용하여 풀이함.

list(combinations(nums, 3)) : [(num1, num2, num3),... , (num4, num5, num6)] 이런식으로 nums에서 3개씩 뽑아서 만들 수 있는 모든 경우의 수를 튜플의 리스트 형태로 반환한다.

👉 따라서, 반복문을 통해 튜플을 하나씩 가져오고 sum(list())를 통해 각각의 합을 구해 소수인지 아닌지 판별한다.

소수 찾는 방법 : 반대로 소수가 아닌 수의 개수를 찾아 전체 경우의 수에서 빼주었다.

👉 제곱근 사용 - 더  자세한 설명은 위의 소수찾기 해설 참고!

음양 더하기

✅ Solution

 

def solution(absolutes, signs):
    answer = 0
    for i in range(len(signs)):
        if signs[i] is not True:
            absolutes[i] = -absolutes[i]
        answer += absolutes[i]
    return answer

 

👉  반복문 돌려서 signs 값이 false 이면, -부호 붙여주고 이후에 값을 다 더한값을 반환한다.

👉 false 인지? 조건문으로 확인하려면 ~ is not True 로 써주면 된다.

 

 다른 사람 풀이 참고

 

def solution(absolutes, signs):
    return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))

 

👉 우왓.. zip() 왜 활용을 못하니..

기사 단원의 무기

✅ Solution

 

def solution(number, limit, power):
    res = []
    for i in range(1, number+1):
        answer = 0
        for j in range(1, int(i**(1/2))+1):
            if i % j == 0:
                if j == i**(1/2):
                    print(i, j)
                    answer += 1
                else:
                    answer += 2
        if answer > limit:
            res.append(power)
        else:
            res.append(answer)
    return sum(res)

 

👉 아이디어

  • 반복문 돌려서 1 ~ num 의 약수 개수로 이루어진 리스트 생성
  • 그 리스트에서 limit(제한수치)보다 높은 수가 있으면 값을 power로 바꿔준다.
  • 마지막으로 리스트의 값들을 모두 합해서 반환한다. ( sum() 사용 )

👉 처음에 그냥 range(1, i+1) 로 잡고 약수 개수를 다 구했더니 시간 초과되는 테스트 케이스가 발생했다.

👉 range(1, 제곱근) 으로 다시 잡아서 구한 약수가

     (1) 제곱근이면?

         : count +1

     (2) 제곱근이 아니면?

         : 대칭이므로 count +2

👉 약수를 구한 후, limit와 비교하여 크면 poswer를, 작으면 해당 값을 정답 리스트에 추가한다.

👉 sum() 을 사용하여 정답 리스트의 합을 반환한다.

 

 다른 사람 풀이 참고

 

def cf(n): # 공약수 출력
    a = []
    for i in range(1,int(n**0.5)+1):
        if n%i == 0:
            a.append(n//i)
            a.append(i)
    return len(set(a))
def solution(number, limit, power):
    return sum([cf(i) if cf(i)<=limit else power for i in range(1,number+1)])

 

👉 Set 함수로 중복되는 값을 제거해서 제곱수를 해결함

'알고리즘풀이 > 프로그래머스' 카테고리의 다른 글

[성격 유형 검사하기]  (2) 2023.11.28
[11/22] Lv1.  (2) 2023.11.18
[11/8] Lv1.  (0) 2023.11.04
[10/31] Lv1.  (0) 2023.11.01
[10/22] Lv1.  (0) 2023.10.19