Programmers Level.1 정수 제곱근 판별
def solution(n):
if n**0.5 == int(n**0.5):
return((n**0.5 + 1)**2)
return -1
Programmers Level.1 제일 작은 수 제거하기
def solution(arr):
arr.remove(min(arr))
if len(arr) == 0:
return -1
return arr
Programmers Level.1 짝수와 홀수
def solution(num):
if num % 2 == 0:
return 'Even'
return 'Odd'
Programmers Level.1 최대공약수와 최소공배수
def solution(n, m):
a, b = max(n,m), min(n,m)
while a % b != 0:
a = a-(a//b)*b
a, b = b, a
return [b, n*m//b]
Programmers Level.1 콜라츠 추측
def solution(num):
cnt = 0
while num > 1:
if num % 2 == 0:
num //= 2
else:
num = num * 3 + 1
cnt += 1
if cnt == 500:
return -1
return cnt
Programmers Level.1 평균 구하기
def solution(arr):
sum = 0
for i in arr:
sum += i
return sum / len(arr)
Programmers Level.1 하샤드 수
def solution(x):
sum = 0
for i in str(x):
sum += int(i)
if x % sum == 0:
return True
return False
- 다른 사람의 풀이를 참고 하니 배울 점이 있어서 적어본다.
def solution(x):
return x % sum([int(c) for c in str(x)]) == 0
- for문으로 리스트를 만들고 sum함수를 사용하는 것, 비교문에서 True/False로 나오는 걸 return하는 아이디어.. 좋다.
Programmers Level.1 핸드폰 번호 가리기
def solution(phone_number):
answer = ''
for i in range(len(phone_number)):
if i < len(phone_number)-4:
answer += '*'
else:
answer += phone_number[i]
return answer
- 다른 사람들이 더 잘 풀었다고 생각해서 아래에 적어본다.
def solution(phone_number):
return '*'*(len(phone_number)-4) + phone_number[-4:]
- slicing을 활용한 풀이. 기억하자.
Programmers Level.1 행렬의 덧셈
def solution(arr1, arr2):
n = len(arr1)
m = len(arr1[0])
sum = [[0] * m for _ in range(n)]
for i in range(n):
for j in range(m):
sum[i][j] = arr1[i][j] + arr2[i][j]
return sum
Programmers Level.1 x만큼 간격이 있는 n개의 숫자
def solution(x, n):
answer = []
nx = 0
for i in range(n):
nx += x
answer.append(nx)
return answer
- 다른 사람의 풀이를 참고해서 아래와 같이 적어봤다.
def solution(x, n):
return [(i + 1) * x for i in range(n)]
- 리스트 안에 for문을 넣는 것. 기억하자!
Programmers Level.1 직사각형 별찍기
a, b = map(int, input().strip().split(' '))
for i in range(b):
print('*'*a)
***축*** 레벨 1 끝!
Programmers Level.2 문자열 압축
def solution(s):
answer = []
if len(s) == 1: # 길이가 1인 문자열은 바로 반환
return 1
for i in range(1, len(s)//2 + 1):
array = [] # 문자열 s를 길이가 i인 문자열로 끊어서 array에 집어 넣기
j = 0
while i*j <= len(s):
if s[i*j:i*(j+1)] != '':
array.append(s[i*j:i*(j+1)])
j += 1
before_word = ''
new_word = ''
cnt = []
for k in array: # array에 속한 원소들을 하나씩 확인
if k == before_word: # 이전에 확인한 원소와 같으면
cnt[-1] += 1 # 카운트를 1더하고
else:
before_word = k # 다르다면 before_word를 갱신
new_word += k
cnt.append(1) # 카운트에 1을 넣음
answer.append(len(new_word) + sum(map(len, [str(i) for i in cnt if i != 1])))
return min(answer)
- 문제 난이도가 확 어려워졌다.
- 시간이 오래 걸렸는데, 그 이유는 1) 길이가 1인 문자열을 따로 고려해주지 않았다. 2) 중복되는 문자열 개수에 상관없이 1을 더해줬는데 중복되는 문자열 개수가 10 이상을 넘어가면 2를 더해줘야 했다. 100을 넘어가면 3을 더했어야 했고, 여하튼 이걸 고려해줬더니 정답 맞았다.
'알고리즘 문제 풀이 > Programmers' 카테고리의 다른 글
[6회차] (0) | 2021.12.09 |
---|---|
[5회차] (0) | 2021.12.08 |
[3회차] (0) | 2021.12.06 |
[2회차] (0) | 2021.12.05 |
[1회차] (0) | 2021.12.04 |
댓글