16 Jun 2021
|
기초
프로그래머스
TIL
수박수박수
문제 설명
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
사고 과정
def solution(n):
str = ""
for i in range(0,n):
if i%2 ==0:
str += "수"
else:
str += "박"
return str
n이 짝수 혹은 0일때 “수” 홀수일때 “박”을 출력하도록 0부터 n까지 반복한다.
모범 답안
def water_melon(n):
s = "수박" * n
return s[:n]
읽기 쉽다.
모범 답안2
def water_melon(n):
return "수박"*(n//2) + "수"*(n%2)
메모리공간의 낭비가 없다.
주요 포인트 및 생각해볼 점
22일째쯤 되었는데 혼자 공부하려니 조금 심심하다
15 Jun 2021
|
기초
프로그래머스
TIL
약수의 개수와 덧셈
문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제출 답안
def solution(left, right):
def num_of_divisor(num):
arr = []
for i in range(1,num+1):
if num%i == 0:
arr.append(i)
return len(arr)
#약수의 갯수를 구하는 함수
ans = 0
for i in range(left, right+1):
if (num_of_divisor(i))%2 == 0:
ans += i
else:
ans -= i
return ans
#약수의 갯수가 짝수면 더하고 홀수면 빼기
모범 답안
def solution(left, right):
answer = 0
for i in range(left,right+1):
if int(i**0.5)==i**0.5:
answer -= i
else:
answer += i
return answer
완전제곱수의 약수의 갯수가 홀수개라는 점을 이용한 좋은 코드이다.
이 모범답안을 참고해서 제곱근을 판별하는 문제도 풀었다.
문제 설명
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제출 답안
def solution(n):
return (n**0.5+1)**2 if int(n**0.5) == n**0.5 else -1
주요 포인트 및 생각해볼 점
수학에 관심을 좀 가질걸 하지만 이제도 늦지 않았다!
algorithm에서 함수 안에 함수를 넣는 것을 처음 해봤다.
15 Jun 2021
|
기초
프로그래머스
나중에 살펴보기
TIL
완주하지 못한 선수
문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
사고 과정
def solution(participant, completion):
if (i in participant) and ( i not in completion):
return i
무식하면 용감하다고 이런 생각을 했다. 물론 작동하지 않는다.
participant - completion하면 되는거 아닌가?! 라고도 생각했다.
모범 답안
import collections
def solution(p, c):
p.sort()
c.sort()
ans = collections.Counter(p) - collections.Counter(c)
return list(ans)[0]
그런데 그것이 실제로 일어났습니다..!
collections 모듈의 Counter 클래스는 dictionary를 확장한 클래스로, 데이터의 개수를 효과적으로 셀 수 있는 기능을 제공한다.
Counter(participant)는 participant의 각 요소들과 그 개수를 짝지어서 가지고 있기 때문에, Counter(completion)을 빼 주게 되면 겹치는 요소들의 개수를 빼서 결과적으로 answer에는 단 하나의 이름(key)과 1(value)만 남게 된다.
모범 답안2
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
설명 출처 : 오지님의 블로그
모범 답안 출처: 개발개발 울었다
주요 포인트 및 생각해볼 점
해쉬(Hash): 임의 값을 고정 길이로 변환하는 것
해쉬 구조란?
키(Key)와 값(Value)쌍으로 이루어진 데이터 구조를 의미한다. Key를 이용하여 데이터를 찾으므로, 속도를 빠르게 만드는 구조이다.
파이썬에서는 딕셔너리(Dictionary) 타입이 해쉬 테이블과 같은 구조이다.
기본적으로는, 배열로 미리 Hash Table 크기만큼 생성해서 사용한다. 공간은 많이 사용하지만, 시간은 빠르다는 장점이 있다.
검색이 많이 필요한 경우, 저장, 삭제, 읽기가 많은 경우, 캐쉬를 구현할 때 주로 사용된다.
인터넷의 답안을 복사해서 붙여넣었더니 프로그래머스에서 완료처리가 되지 않았다. 나중에 다시 보고 직접 collection을 이용해서 짜봐야겠다.
출처 : DAVINCI - AI
15 Jun 2021
|
기초
프로그래머스
TIL
콜라츠 추측
문제 설명
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2.결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.
제출 답안
def solution(num):
count = 0
while num > 1:
# 이 줄은 초보몽키님의 코드를 보고 고쳤다
# while 조건: 이 조건이 참인 동안 반복한다
if num % 2 ==0:
num = num/2
else:
num = (num*3)+1
count += 1
return count if count < 500 else -1
모범 답안
def collatz(num):
for i in range(500):
num = num / 2 if num % 2 == 0 else num*3 + 1
if num == 1:
return i + 1
return -1
주요 포인트 및 생각해볼 점
6월15일에 풀 때는 꽤 어려웠는데 지금 보니까 쉬워보인다. - 07.15
15 Jun 2021
|
기초
프로그래머스
질문
TIL
작은수 제거하기
문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.
제출 답안
def solution(arr):
if len(arr) == 1:
return [-1]
else:
arr.pop(arr.index(min(arr)))
#처음에 index를 빼먹었다.
return arr
arr.pop 은 리스트의 마지막 인수를 제거한다.
모범 답안
def rm_small(mylist):
return [i for i in mylist if i > min(mylist)]
리스트에서 중에서 제일 작은 수 보다 큰 수들이 들어있는 배열을 출력한다.
주요 포인트 및 생각해볼 점
arr.pop 은 리스트의 마지막 인수를 제거한다.
arr.pop(x)는 리스트의 x번째 인수를 반환하고 원래 리스트에서 그 요소는 삭제한다.
arr.remove(x)는 리스트에서 x를 찾아서 제거한 새 리스트를 만들기 때문에 값을 반환하지도 않고 원래 리스트에서 x를 삭제하지도 않는다.
질문
arr.pop(arr.index(x)) 여기에서 중간에 arr가 왜 또 들어갈까?
15 Jun 2021
|
기초
프로그래머스
TIL
약수의 합
문제 설명
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
제출 답안
def solution(n):
ans = 0
for i in range(1,n+1):
if n%i==0:
ans += i
return ans
range(0,n+1)이라고 써서 처음에 0은 나눌 수 없다는 에러가 떴다.
모범 답안
def sumDivisor(num):
# num / 2 의 수들만 검사하면 성능 약 2배 향상잼
return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])
수학 설명
예를 들어 12(n)의 약수 1, 2, 3, 4, 6, 12 중 자신을 제외한 가장 큰 약수는 n/2 이므로, 12의 반인 6까지만 약수 검사를 진행해도 약수의 갯수를 구할 수 있다.
파이썬에서 ‘/’ 나누기 연산자를 두번 ‘//’쓰면 나머지 소수점을 버린 몫을 얻는다.
예를 들면 5/2 = 2.5 이지만 5//2 = 2 이다.
이렇게 하면 연산 속도가 2배 빨라진다.
주요 포인트 및 생각해볼 점
for 반복문을 []를 이용해서 한 줄로 쓰는 연습을 해봐야겠다.
14 Jun 2021
|
기초
TIL
복습
주어진 숫자의 길이와 모든 자리수의 합을 구해보자
- 짧은 코드
x = input() #x값을 입력받는 부분
print(len(list(str(x)))) #길이
print(sum(list(map(int,list(str(x)))))) #자리수의 합
- 풀이 과정
x = 1988 #예를 들어 1988을 입력받았다
#입력받을 때 str로 받고 싶으면 x = str(input())
#int형은 iterate할 수 없기 때문에 1988을 [1,9,8,8] 로 만들려면
#먼저 int를 str으로 바꾸고 리스트로 묶어준다.
arr = list(str(x))
print arr
# 출력 : ['1', '9', '8', '8']
print (len(arr))
# 리스트의 갯수를 구하는 len()을 사용해서 숫자의 개수(길이)를 구할 수 있다.
# 출력 : 4
int_arr = map(int, arr)
# str은 연산이 안 되서 해당 숫자를 모두 더하려면 모든 숫자를 다시 인트로 만들어줘야한다.
print(int_arr)
#이렇게 하면 이게 나온다. <map object at 0x1039d7df0>
#저장된 메모리 위치일까?
int_arr = list(map(int, arr))
#map은 찢기만 하는거라서 리스트에 다시 넣어줘야 한다.
print(int_arr)
# 출력 : ['1', '9', '8', '8']
answer = sum(int_arr)
print(answer)
# 출력 : 26
백준 입력값 받는 부분
algorithm 백준에서 변수 입력받는 부분이 항상 헷갈려서 정리해봤다.
프로그래머스에서는 이런 고민을 안 해도 되서 좋은데 문제가 더 어렵다.
#변수 한 개 입력받음
a = input()
#변수 두 개 한 줄에 입력받음
a, b = input().split()
#변수 여러 개 n 줄에 걸쳐 입력받음
for _ in range(n):
a = int(input())
#변수 여러개 한 줄에 입력받음
arr = list(map(int, input().split()))
14 Jun 2021
|
기초
프로그래머스
TIL
행렬의 덧셈
문제 설명
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
입출력 예
arr1 |
arr2 |
return |
[[1,2],[2,3]] |
[[3,4],[5,6]] |
[[4,6],[7,9]] |
[[1],[2]] |
[[3],[4]] |
[[4],[6]] |
제출 답안
def solution(arr1, arr2):
ans = []
for i in range(len(arr1)):
arr_in_ans=[]
## 배열이 두 겹이라 변수도 두 겹으로 만들어야한다.
for j in range(len(arr1[0])):
## range(len(arr1[0])) : arr1의 0번째 배열 안의 배열의 길이
arr_in_ans.append(arr1[i][j]+ arr2[i][j])
# i 와 j의 위치를 잘 생각하자
ans.append(arr_in_ans)
return ans
모범 답안
def sumMatrix(A,B):
answer = [[c + d for c, d in zip(a, b)] for a, b in zip(A,B)]
return answer
주요 포인트 및 생각해볼 점
배열안의 배열에 접근하는 법을 쓰는 부분이 어려웠다.
zip은 배웠는데도 까먹어서 쓰지 못했어서 다음에 zip으로 다시 해봐야겠다.
지금은 초보라서 zip을 안 쓰고 구현해보는 것도 좋은 연습이 될 것 같다. - 6.17 그렇지 않다 - 07.15 있는 것은 다 가져다쓰면서 실력을 늘려가는게 좋겠다(믹서기 있으면 맷돌 없어도 된다)
14 Jun 2021
|
기초
프로그래머스
TIL
하샤드 수
문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
입출력 예
arr |
return |
10 |
true |
12 |
true |
11 |
false |
13 |
false |
사고 과정
주어진 숫자를 자릿수를 모두 더한 값으로 나눈다.
def solution(x):
sum_of_digits = (sum(list(map(int,list(str(x))))))
if (x % sum_of_digits) = 0:
# x 가 str형이라서 연산이 되지 않았다
ans = True
else:
ans = False
return ans
제출 답안
def solution(x):
a = int(x)
#x값을 int형으로 받는다
return True if a % sum(list(map(int,list(str(x))))) == 0 else False
#x를 자릿수의 합으로 나눈 값의 나머지가 0이면 참을 리턴하고 아니면 거짓을 리턴한다
[true_value] if [condition] else [false_value]
[] 괄호를 제외하고 사용하면 된다. return을 두 번 쓰지 않도록 주의한다.
모범 답안
def Harshad(n):
return n % sum([int(c) for c in str(n)]) == 0
아름답고 간결한 코드이다.
주요 포인트 및 생각해볼 점
정수(int)를 찢어서 배열에 넣는 부분을 정리해서 포스팅해야겠다.
-> 파이썬 숫자,문자,리스트,맵 연습
13 Jun 2021
|
기초
프로그래머스
TIL
1. 프로그래머스 x만큼 간격이 있는 n개의 숫자
문제 설명
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
입출력 예
x |
n |
answer |
2 |
5 |
[2,4,6,8,10] |
4 |
3 |
[4,8,12] |
-4 |
2 |
[-4,-8] |
제출 답안
def solution(x, n):
ans = []
a = x
for _ in range(n):
ans.append(x)
x += a
return ans
2. 프로그래머스 직사각형별찍기
문제 설명
이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.
제출 답안
a, b = input().split()
# 두 변수를 입력받음
for _ in range(b):
print("*" * a)
주요 포인트 및 생각해볼 점
백준 문제를 풀 때 두 변수를 각각 입력받을 때는 split()만 사용하면 되지만
여러 개의 변수를 한 개의 리스트에 입력받으려면
a = list(map(int, input().split()))
이렇게 써줘야한다.