본문 바로가기
알고리즘 문제풀이/프로그래머스 Lv0

[프로그래머스] 코딩테스트 입문 문제 풀이

by summer_light 2023. 5. 21.

[내 풀이]
- 문자열 수식이라서 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

 

[python] 파이썬 set (집합) 자료형 정리 및 예제

안녕하세요. BlockDMask 입니다. 오늘은 파이썬에서 집합 자료형인 set 자료형에 대해서 이야기 해보려 합니다. 집합 자료형은 다른 자료형의 중복 제거할때 사용을 하기도 하는데요. 자세한것은 예

blockdmask.tistory.com

* 대칭 차집합:

* 위 블로그에서 다시 읽어볼만한 내용 스크랩 (더보기 클릭) 

[내 풀이]
- 순열을 이용해 모든 경우의 수를 구했다.

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

댓글