👉 사용 언어 : 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 |