알고리즘 350

[프로그래머스, 파이썬] 덧칠하기

풀이 try, except를 사용한 풀이로 n+1 길이의 배열을 만든 후 덧칠해야하는 section을 탐색하면서 칠해져 있다면 패스 아니라면 해당 위치부터 범위까지 1로 만든 후 카운팅 넘어 버린다면 카운팅만 해서 해결 만약 여기서 에러가 발생했다면 아래와 같이 해결했을 듯 범위가 넘어간다면 해당 칸에서 한 칸씩 줄이면서 어떻게든 칠하게 만든다면 해결이 거의 되지 않을까 했는데 에러가 없어서 그냥 이렇게 해결 완. def solution(n, m, section): result = 0 li = [0]*(n+1) for i in section: if not li[i]: try: li[i:i+m] = [1]*m result += 1 except: result += 1 return result

알고리즘 2024.03.11

[프로그래머스, 파이썬] 기사단원의 무기

풀이 해당 문제는 약수를 찾기위한 범위를 어떻게 지정하냐에 따른 시간 초과를 해결하는 문제로 단순히 1부터 해당 숫자까지 또는 해당 숫자의 절반까지를 조사하게 되면 시간 초과가 발생하여 해결하지 못하게 된다. 그래서 지난 소수 찾는 문제에서 확인한 것 처럼 해당 숫자의 루트를 씌운 값까지 찾게 한다면 반복 횟수를 줄이며 탐색할 수 있기에 int(i**(1//2)+1로 작성하여 해결 그리고 set 타입 s에 추가하도록하여 중복된 것은 없애도록 하여 조건 분기에 따른 처리 후 해결 def solution(number, limit, power): result = [0]*number result[0] = 1 s = set() for i in range(2,number+1): for j in range(1,int..

알고리즘 2024.03.11

[프로그래머스, 파이썬] 옹알이 (2)

풀이 이번 옹알이 문제는 같은 발음을 연속해서 하지 못하는 것 말고는 몇번을 해도 되는 문제였기에 우선 babbling에 있는 단어 bab을 s 위치로 부터 +2, +3 까지 확인 후 해당 범위의 단어가 baby라는 할 수 있는 발음에 해당 하는지에 대한 조건 분기 처리 여기서 이전의 단어인 bf와 현재 단어가 같다면 탈출할 수 있도록 처리 그리고 baby 단어 목록을 다 탐색해도 맞는 단어가 없는지 체크하는 check에 대해서도 조건 처리 하여 해결 def solution(babbling): result = 0 baby = ["aya", "ye", "woo", "ma"] for bab in babbling: s,state,text,bf = 0,False,"","" while True: check = F..

알고리즘 2024.03.08

[프로그래머스, 파이썬] 문자열 나누기

풀이 뭔가 깔끔하게 풀지 못한 느낌이 없지 않아 있지만 여러 개의 조건 분기를 활용하여 해결 우선 시작이 되는 x의 값을 초기화 했을 때마다 카운팅과 함께 해당 값을 x에 할당하고 x와 다를 경우 li[1]에 카운팅 하는 형식으로 한 다음 li의 두 인덱스인 카운팅 값이 같다면 cnt에 카운팅하고 다시 초기화하기 이후 딱 떨어지는 문자가 아닐 경우에 대한 조건처리하여 해결 def solution(s): x,cnt = "",0 li = [0,0] for i in range(len(s)): if x == "": li[0] += 1 x = s[i] elif x == s[i]: li[0] += 1 elif x != s[i]: li[1] += 1 if li[0] == li[1]: cnt += 1 x = "" li..

알고리즘 2024.03.08

[프로그래머스, 파이썬] 숫자 짝꿍

풀이 첫 풀이 접근으로는 x의 각 문자에 해당하는 인덱스 값에 1증가, y에 해당하는 인덱스 값에 1 감소하면서 result에 추가하여 해결하려 했지만 시간초과가 발생 그래서 x와 y에 교집합에 해당하는 문자를 찾고 조건 분기로 같은 게 없다면 -1, 있지만 1개이고 그게 0이라면 개수에 상관없이 0을 return 그게 아닐 경우엔 다음 return으로 가서 count를 사용하여 적은 만큼 출력하여 해결 def solution(x,y): xy = set(x) & set(y) if not xy: return "-1" elif len(xy) == 1 and "0" in xy: return "0" return "".join(sorted([i*min(x.count(i),y.count(i)) for i in xy..

알고리즘 2024.03.07

[프로그래머스, 파이썬] 소수 찾기

풀이 처음에는 특정 수의 절반까지만 조회를 하는 코드를 적용했는데 해당 코드는 시간초과와 효율성 문제로 해결되지 못하였다. 그래서 찾아보니 특정 수의 제곱근까지만 약수를 확인하면 된다고 하여 첫 번째 풀이는 round(i**(1/2))까지 탐색하도록 하니 해결할 수 있었다. 그리고 두 번째 풀이는 에라토스테네스의 체를 사용한 방법으로 대량의 소수들을 구할 때 사용하는 알고리즘이라고 해서 사용해봤는데 해당 알고리즘은 특정 수의 배수를 범위까지 조사하며 지우는 것으로 2번째 for문에서 i에 해당하는 배수부터 시작해서, n까지 조사하되, i만큼 계속 j가 커지도록 하여 조사하기. 효율성 시간을 확인해보니 확실히 차이가 있는 것을 확인할 수 있음. 기본 풀이 def solution(n): result = [2..

알고리즘 2024.03.07

[프로그래머스, 파이썬] 뒤에 있는 큰 수 찾기

풀이 처음에는 두 번째 풀이처럼 접근을 했지만 2개의 시간초과로 인해 해결하지 못했다. 이유는 범위를 최대한 좁히려고 했지만 범위가 너무 넓은 배열을 2중 for문이기에 좁혀도 무리가 있었던것 같다. 그래서 첫 번째 풀이처럼 deque를 활용해서 우선 q가 있는지 그리고 q의 첫 번째 값의 숫자가 지금 조회하는 num보다 큰지 확인하여 그렇다면 q의 첫 번째 인덱스에 해당하는 result에 현재의 num을 적용하며 해결 from collections import deque def solution(numbers): result = [-1]*len(numbers) q = deque([(numbers[0],0)]) for i,n in enumerate(numbers[1:]): while q and q[0][0]

알고리즘 2024.03.05

[프로그래머스, 파이썬] 체육복

풀이 딕셔너리를 활용해서 학생의 수에 따른 각각의 체육복을 채워주고 이후 여분의 체육복을 가진 학생과 잃어버린 학생의 교집합에 해당하는 학생에 대한 처리 후 나머지 잃어버린 학생들에 대한 처리 결과는 dic.values()에 있는 값 중 1을 넘어가는 값만 카운팅한 합을 출력하여 해결 def solution(n, lost, reserve): dic = {i:1 for i in range(1,n+1)} for i in reserve: dic[i] += 1 s_re,s_lo = set(reserve),set(lost) for i in s_re.intersection(s_lo): dic[i] -=1 for i in s_lo-s_re: dic[i] -= 1 if dic[i] == 0: if dic.get(i-1..

알고리즘 2024.03.05

[프로그래머스, 파이썬] 대충 만든 자판

풀이 keymap으로 받아오는 자판을 딕셔너리로 각 문자를 할당 후 해당 순서에 따른 인덱스값을 딕셔너리의 값으로 할당 가장 적게 누르기를 원하기에 최소값을 넣어주기 이후 targets에 해당하는 문자를 입력하여 cnt 변수에 누적합 적용 만약 특정문자가 없는 경우 반복문 탈출하여 해결 def solution(keymap, targets): dic = dict() result = [] for keys in keymap: for idx,key in enumerate(keys): if dic.get(key): dic[key] = min(dic.get(key),idx+1) else: dic[key] = idx+1 for tg in targets: cnt = 0 for i in tg: if dic.get(i):..

알고리즘 2024.03.05