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 |
댓글