- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42839

 

Lv2 문제이고, 스스로 푼 문제다!

주어진 numbers 숫자를 구성하는 숫자들로 만들수 있는 소수의 갯수를 찾는 문제다.

여기서 4자리 수라면 1자리 수부터 4자리수까지 나열할 수 있는 경우는 모두 다 나열한 다음, 그 중에서 소수를 중복되지 않게 세는 것이 중요하다

그래서 나열하는 경우는 permutations로 구현했고, 중복되지 않게 세는 것은 check 배열을 이용해서, 여기에 없는 수만 세도록 했다

 

 

- 정답 풀이 :

import math
from itertools import permutations

def isPrime(num):
    flag = True
    if num == 1 or num == 0:
        return False
    
    for i in range(2, int(math.sqrt(num) + 1)):
        if num % i == 0:
            return False
        
    if flag:
        return True
              
def solution(numbers):
    
    numbers = list(numbers)
    n = len(numbers)
    
    answer = 0
    check = []
    for i in range(1, n + 1):
        #순열로 i자리수 숫자를 임의 생성한다
        result = permutations(numbers, i)
        #만들어진 i자리수 수 중에서 소수이고, 중복이 안되는 경우를 센다 
        for x in result:
            temp = int(''.join(x))           
            if isPrime(temp) and temp not in check:
                answer += 1
                check.append(temp)
        
    return answer

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

Lv2 문제이고, 풀다풀다 답 찾아본 문제이다!

 

디버깅을 통해서 내림차순으로 정렬하면 대충 원하는 순서대로 숫자들이 정렬된다. 근데 예제에서 30과 3을 나열하는 거는 정답을 만족하지 못해서 이를 해결할 방법이 필요했다. 

 

찾아보니 세자리 수 이상으로 자릿수를 맞추어 아스키 코드에 따라 정렬하는 방법이 있다.

numbers의 원소들은 1000이하 이므로, 4자리 수라면 1000 밖에 없고, 그 외에는 최대 3자리 수밖에 안된다. 그렇기 때문에 

네번재 자릿수부터의 수로 인한 정렬의 변화는 의미가 없다.(네번째 자릿수가 정렬에 영향을 미친다는 것은 세번째 자릿수까지의 수가 서로 같다는 뜻인데, 이 때는 실제로 둘 다 같은 수 취급이므로 어떻게 정렬되든 상관이 없기 때문이다.)

 

- 정답 풀이 :

def solution(numbers):
    answer = ''
    
    numbers = list(map(str, numbers))
    #이렇게 하면 3은 333으로, 30은 303030으로 3 30 순서로 정렬된다
    numbers.sort(key = lambda x: x*3, reverse = True)

	# 00, 000 같은 경우를 해결하기 위해 형변환
    return str(int(''.join(numbers)))

 

 

- 시도해본 풀이 :

 

딱 1 / 3 테스트 성공한 풀이다. 

이 경우에 [3, 30, 34, 5, 9]의 경우 9534303을 출력해서 정답인 9534330과 다르게 출력되어 틀린다

3과 30인 경우를 어떻게 해야하나 고민이 되었다

def solution(numbers):
    
    for i in range(len(numbers)):
        numbers[i] = str(numbers[i])
        
    numbers.sort(reverse = True)
    print(numbers)
    
    return ''.join(numbers)

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/1844

 

Lv2 문제이고, 스스로 푼 문제다!

기본 탐색 문제이고, 탐색하면서 (0,0) 에서 (-1, -1)까지 가는 경로 중 최단거리를 반환하는 문제다 

 

문제 풀이

- 지나왔던 길 다시 가면 안되니까 visit 처리해주고, 벽인 곳(0) 지나가면 안되니까 0이 아닌 곳일 때 진입할 수 있다.

- 최단 거리를 의미하므로 만약 가는 길이 초행길이라면 현재 위치의 값을 더해주면 되고 다른 길이 지나갔는데 현재 길에서 가는게 더 최단거리라면 기존에 있는 값과 현재 위치 값 + 1을 비교해서 최솟값을 누적해준다.

- 방문 처리와 이동까지 처리해준다

- 오른쪽 끝이 1이라면 주변이 벽으로 막힌 경우이므로 -1을 반환하고, 아니라면 해당 위치의 값을 반환한다 

 

- 정답 풀이 : 

from collections import deque

def solution(maps):
    n = len(maps)
    m = len(maps[0])
    
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    queue = deque()
    queue.append((0,0))
    visit = [[0] * m for _ in range(n)]
    visit[0][0] = 1

    while queue:
        x, y = queue.popleft()   
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and not visit[nx][ny] and maps[nx][ny] != 0:
                if maps[nx][ny] == 1:
                    maps[nx][ny] += maps[x][y]
                visit[nx][ny] = 1
                queue.append((nx,ny))
             
    if maps[-1][-1] == 1:
        return -1
    else:
        return maps[-1][-1]

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/84512

 

Lv2. 문제다!

처음에는 내가 문자 규칙을 다 알아낸 다음 주어진 단어에 따라 규칙을 통해 순서를 찾아내는 거라고 생각했다

근데 규칙을 어떻게 찾아야할지 잘모르겠어서 막막했던 문제다

 

풀이를 보니까 문자 개수가 5개밖에 안되므로 이들로 만들 수 있는 모든 문자열을 만든다음 정렬한 후 해당 단어의 index + 1을 출력하면 된다 

 

product가 뭔지 몰라서 알아봤다 

product는 중복 순열을 만들어내는 함수로, 형식은 product(list, reapeat = num)형식으로 하면 list의 원소들 중에서 num 길이 만큼의 중복된 순열을 반환한다 

 

문제 이해 

1. 1자리수부터 6자리수 만큼의 주어진 문자들로 중복순열을 만들어 낸 다음 words에 추가한다 

2. words에서 주어진 word의 인덱스를 찾고 거기에 +1한 값을 반환한다 

 

- 정답 풀이 :

from itertools import product
# 갯수가 5개이므로 중복순열을 이용해서 가능한 모든 조합을 구한 후 index구한다
def solution(word):
    words = []
    for i in range(1, 6):
        for c in product(['A', 'E', 'I', 'O', 'U'], repeat = i):
            words.append(''.join(list(c)))
            
    words.sort()
    return words.index(word) + 1

+ Recent posts