[프로그래머스] 기초 코딩테스트 참고 [Python]

원준·2023년 4월 20일
0

코딩 테스트

목록 보기
3/18

1. 소인수 분해 함수 참고용이다. not in도 유심히 불 필요가 있다.

d = 2
    while d <= b:
        if b % d == 0:
            b /= d
            if d not in answer:
                answer.append(d)
        else:
            d += 1

2. 특정 소수의 소수점이 전부 0인지 판별한다.

float(a/b).is_integer()

3. '3' in str(정수)

  • 정수 값을 문자열로 변경해 3이라는 수가 존재하는지 판별한다.
while answer % 3 == 0 or '3' in str(answer):
            answer += 1

4. 람다 사용 하면 간단하게 가능하다.

  • 조금더 공부 후 알아보자
# 람다 참고 용
sorted(numlist,key = lambda x : (abs(x-n), n-x))
# 내가 했던 방식에서 람다로 줄일 수 있다.
def solution(numlist, n):
    answer = [abs(n-i) for i in numlist]
    
    i = 0 
    while i < len(numlist):
        start_index = i
        index_count = answer[i:].count(min(answer[i:]))
        for n in range(index_count):
            find_num = answer[i:].index(min(answer[i:])) + i
            answer[i], answer[find_num] = answer[find_num], answer[i]
            numlist[i], numlist[find_num] = numlist[find_num], numlist[i]
            i += 1
        dummy_num = sorted(numlist[start_index:start_index+ index_count])[::-1]
        numlist[start_index:start_index+ index_count] = dummy_num        
    
    return numlist

5. 반복문을 돌릴때 split를 따로 변수로 받아서 하는것보다 반복문에 직접 할때 조금 더빠르다.

# 그냥 하는게 더 빠르다.
 for i in polynomial.split(" + "):

6. 특정 랜덤 수를 받아 가장 자주 많이 나오는 값을 찾는 함수다

  • 딕셔너리를 사용하여 풀긴했지만 enumerate를 사용한다면 더 간단해진다.
  • 이후 람다와 같이 공부해보자.
# 참고 용
 while len(array) != 0:
        for i, a in enumerate(set(array)):
            array.remove(a)
        if i == 0: return a
    return -1
# 내가 한 코드
result = {}
    for i in list(set(array)):
        result[i] = array.count(i)
    
    result_keys = list(result.keys())
    result_values = list(result.values())
    if result_values.count(max(result_values)) > 1:
        return -1
    else:
        return result_keys[result_values.index(max(result_values))]

7. 내장 함수 eval()을 이용하면 문장열인 계산식을 계산할 수 있다.

eval(equation)

8. 두 수의 최대 공약수를 찾아내는 함수다.

for i in range(1, answer[1] + 1):
        if (answer[0] % i == 0) & (answer[1] % i == 0):
            answer_values = i 

9. 폭탄 범위를 나타내는 방법이다.

  • 리스트의 범위를 넘어가서 오류를 일으키는것에 대해 try를 이용해 해결했다.
  • 범위는 3x3으로 설정되어 있는데 좋은 방법이 있느지 다른 공부를 해봐야겠다.
def solution(board):
    for x in range(len(board)):
        for y in range(len(board[x])):
            if board[x][y] == 1:
                for x_n in range(-1, 2):
                    for y_n in range(-1, 2):
                        try:
                            if board[x+x_n][y+y_n] == 0 and x+x_n != -1 and y+y_n != -1:
                                board[x+x_n][y+y_n] = 2
                        except:
                            continue              
    answer = 0
    for i in range(len(board)):
        answer += board[i].count(0)
    return answer

10. 좌표의 길이 3개 중 겹치는 길이를 구하는 함수다.

  • 내가 한 것은 일일히 좌표를 검색해서 사용했는데 머리속에서 잘그려지면 더 줄일수 있을거 같다.
# 참고 용
sets = [set(range(min(l), max(l))) for l in lines]
    return len(sets[0] & sets[1] | sets[0] & sets[2] | sets[1] & sets[2])
# 내가 한 코드
def solution(lines):
    answer = []
    
    for i in range(len(lines)-1):
        for j in range(i+1, len(lines)):
            for n1 in range(lines[i][0], lines[i][1]):
                line_length = (n1, n1+1)
                for n2 in range(lines[j][0], lines[j][1]):
                    line2_length = (n2, n2+1)
                    if line_length == line2_length:
                        answer.append(line_length)
    
    return len(list(set(answer)))
profile
공부해보자

0개의 댓글