[내 풀이]
- 문자열 수식이라서 eval() 함수를 사용하려고 했다.
def solution(quiz):
return ["O" if eval(q.replace('=', '==')) else "X" for q in quiz]
[참고 풀이]
- 코드 길이는 좀 더 길지만 훨씬 가독성이 좋다고 느껴졌다.
- 이 코드의 댓글에 eval() 함수는 현업에서 사용하면 안 된다는 이야기가 있었다. 보안 때문이라고 하던데... 다음에 찾아봐야겠다. 잘 정리되어 있던 글이 있어서 링크 첨부: (https://velog.io/@kylee31/eval)
def valid(equation):
equation = equation.replace('=', '==')
return eval(equation)
def solution(equations):
return ["O" if valid(equation) else "X" for equation in equations]
[내 풀이]
- common[0][1][2] 등이 반복되니까, 간단한 변수로 바꿔 표현하는 것이 더 적절했을 것이다.
- 아래 코드처럼 한 줄로 표현할 수 있단 걸 알고 습관이었다면, 당연스럽게도 a,b,c 에 할당했을텐데 세 줄이 필요할 줄 알고 그냥 냅다 common[0], common[1] 을 그대로 사용해버렸단 게 아쉽다.
def solution(common):
if (common[2]+common[0])/2 == common[1]:
d = common[1]-common[0]
return common[-1]+d
else:
r = common[1]/common[0]
return common[-1]*r
[참고 풀이]
- a,b,c = common[:3] 과 같이 한 번에 값 깔끔하게 할당했다.
def solution(common):
answer = 0
a,b,c = common[:3]
if (b-a) == (c-b):
return common[-1]+(b-a)
else:
return common[-1] * (b//a)
return answer
[내 풀이]
- 홀수 일때랑 짝수일 때를 구분해서, 중간 값을 중심으로 좌우로 범위를 구하는 방식
def solution(num, total):
if num%2 != 0:
return [x for x in range(total//num-num//2, total//num-num//2+num)]
else:
return [x for x in range(total//num-num//2+1, total//num-num//2+1+num)]
[참고 풀이]
def solution(num, total):
return [(total - (num * (num - 1) // 2)) // num + i for i in range(num)]
- 위의 식이 대표 풀이였는데, 수식만 보고는 이해가 안되었다.
- 한 번에 어떻게 쓴 거지 싶어서 노트에 분해해서 적어보면서 테스트 해본 것.
- 기존 값 num에서 1을 빼줌으로써 홀수일 때, 짝수일 때의 값이 서로 달라지도록 조작한 것이었다.
- (다시보니 그냥 수열의 합 공식 이용해서 방정식 푸신 듯 하다) 난 무슨 짓을 ...
[내 풀이]
- 중복을 허용하지 않으므로 결과 값은 set에 담는다.
- 전체 (i, j)에 대해서 1인 지점에 대해서만 위험지역을 구하고, 집합에 담는다.
def func(n, i, j):
res = []
for x in range(i-1, i+2):
for y in range(j-1, j+2):
if 0<=x<=n-1 and 0<=y<=n-1:
res.append((x,y))
return set(res)
def solution(board):
n = len(board)
res = set()
for i in range(n):
for j in range(n):
if board[i][j] == 1:
res = res | func(n,i,j)
return n*n - len(res)
- 아무런 의미가 없는 res 보다는, danger 이라는 이름을 쓰는 것이 더 좋았을 것이다.
[참고 풀이]
- 이차원 리스트를 탐색할 때 for row in board, for x in row: 와 같이 네이밍하는 것이 인상적이었다.
- set.update 는 set에 여러 값을 한 번에 추가할 때 사용하는 메서드이다. 기존 집합.update({추가할 집합}) 과 같이 사용한다.
- update( ) 안의 수식이 이중 for 문이다. 나도 이런식으로 표현하고 싶었는데, 어떻게 표현할 줄 몰라서 처음 내 풀이 처럼 풀이했었던 것.
- di, dj 와 같이 표현한 점도 한 눈에 들어와서 좋았다고 느꼈던 부분이었다.
def solution(board):
n = len(board)
danger = set()
for i, row in enumerate(board):
for j, x in enumerate(row):
if not x:
continue
danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1, 0, 1])
return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger)
[수정한 내 풀이]
- 참고 풀이의 danger.update() 와 (i+di, j+dj)와 같이 이중 for문으로 표현할 수 있는 점을 응용했다.
- update 하는 시점부터 검증을 하고 값을 update하도록 했다.
def solution(board):
n = len(board)
danger = set()
for i in range(n):
for j in range(n):
if board[i][j] == 1:
danger.update((i+di, j+dj) for di in [-1, 0, 1] for dj in [-1, 0, 1] if 0<=i+di<n and 0<=j+dj<n)
return n*n - len(danger)
* 집합 관련 메서드 잘 정리된 링크 https://blockdmask.tistory.com/451
* 대칭 차집합:
* 위 블로그에서 다시 읽어볼만한 내용 스크랩 (더보기 클릭)
[내 풀이]
- 순열을 이용해 모든 경우의 수를 구했다.
from itertools import permutations
def solution(babbling):
ongal = ["aya", "ye", "woo", "ma"]
words = []
for i in range(1, 5):
for word in permutations(ongal, i):
words.append(''.join(word))
return sum(1 for x in babbling if x in words)
[참고 풀이]
- 왜 w*2 not in b: 라는 조건이 들어가는 지 이해를 못했다.
- b.replace(w, ' ') 때문에 대체된 문자열은 공백이 들어가서 구분이 된다. 중간에 값이 빠지고 왼쪽 오른쪽 값이 만들어지는 경우는 제외될 수 있다.
- 마지막에 b.strip() 을 이용해 공백들을 모두 제거하는 처리
def solution(babbling):
c = 0
for b in babbling:
for w in [ "aya", "ye", "woo", "ma" ]:
if w * 2 not in b:
b = b.replace(w, ' ')
if len(b.strip()) == 0:
c += 1
return c
'알고리즘 문제풀이 > 프로그래머스 Lv0' 카테고리의 다른 글
[프로그래머스] 코딩테스트 기초 (0) | 2023.05.31 |
---|---|
[프로그래머스] 코딩 기초 트레이닝 (0) | 2023.05.22 |
[프로그래머스] 코딩테스트 입문 문제 풀이 (1) | 2023.05.19 |
[프로그래머스] 코딩테스트 입문 문제 풀이 (0) | 2023.05.16 |
댓글