파이썬 알고리즘 : 신규 아이디 추천

2023년 12월 29일 알고리즘 문제풀이 문제 신규 아이디 추천 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 def solution(new_id): arr = ['1','2','3','4','5','6','7','8','9','0','-','_','.'] # 1단계 new_id = new_id.lower() # 2단계 tmp = [] for i in new_id: if i.islower() == True or i in arr: tmp.append(i) new_id = ''.join(tmp) # 3단계 if len(new_id) >1: tmp = [] for i in range(len(new_id)-1): if new_id[i] == '.' and new_id[i+1] == '.': continue tmp.append(new_id[i]) tmp.append(new_id[-1]) new_id = ''.join(tmp) # 4단계 if new_id: if new_id[0] == '.': if len(new_id) == 1: new_id = '' else: new_id = new_id[1:] # 4단계 if new_id: if new_id[-1] == '.': if len(new_id) == 1: new_id = '' else: new_id = new_id[:len(new_id)-1] # 5단계 if new_id == '': new_id = 'a' # 6단계 if len(new_id) >= 16: new_id = new_id[:15] # 6단계 if new_id[-1] == '.': new_id = new_id[:len(new_id)-1] # 7단계 if len(new_id) <= 2: while len(new_id) < 3: new_id = new_id + new_id[-1] return new_id 문제에 주어진 대로, 순차적으로 해결하면 큰 어려움은 없는 문제였다. 다만 중간중간, 문자열이 존재하지 않게 되는 상황이 발생할 수 있기 때문에 이를 따로 처리하는 로직이 필요하다. 시간 많이 잡아먹는 문제라 좋은 연습이 됐다. ...

2023년 12월 29일 · 2 분 · 배준수

파이썬 알고리즘 : 문자열 내 p와 y의 갯수

2023년 12월 28일 알고리즘 문제풀이 문제 문자열 내 p와 y의 개수 난이도 Lv.1 코드 1 2 3 4 def solution(s): a = s.count('p') + s.count('P') b = s.count('y') + s.count('Y') return a == b 이 문제에선 p 와 y만 포함됐지만, 대문자나 소문자 자체를 어떻게 셀 지 궁금해져서 찾아보니 islower() 와 isupper() 를 사용하면 boolean 값으로 반환된다고 한다.

2023년 12월 28일 · 1 분 · 배준수

파이썬 알고리즘 : 줄 서는 방법

2023년 12월 26일 알고리즘 문제풀이 문제 줄 서는 방법 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import math def solution(n, k): answer = [] arr = list(range(1,n+1)) while n>0: tmp = math.factorial(n-1) a = k//tmp k = k%tmp if k: answer.append(arr[a]) arr.pop(a) else: answer.append(arr[a-1]) arr.pop(a-1) n -= 1 return answer 순열에 정의를 알면 접근방식 자체는 그리 어렵지 않지만, 코드로 구현하는 게 꽤나 까다로웠다. 순열은 결국 앞에서부터 올 수 있는 경우의 수를 정해주고 곱하는 방식이다. 4명이 줄을 서는 방법은 4! = 4 x 3 x 2 x 1이다. 왜 이렇게 나오냐면, 맨 앞에 올 수 있는 후보는 4개 이고, 그 다음은 3개, 2개, 1개 이기 때문이다. ...

2023년 12월 26일 · 2 분 · 배준수

파이썬 알고리즘 : 최댓값과 최솟값

2023년 12월 25일 알고리즘 문제풀이 문제 최댓값과 최솟값 난이도 Lv.2 코드 1 2 3 4 5 def solution(s): answer = '' arr = list(map(int,s.split())) answer = str(min(arr)) + ' ' + str(max(arr)) return answer 문자를 공백을 기준으로 쪼개 숫자형으로 변환하여 배열에 저장하였다. 최댓값과 최솟값만 다시 문자열로 변환한 쉬운 문제.

2023년 12월 25일 · 1 분 · 배준수

파이썬 알고리즘 : 성격 유형 검사

2023년 12월 22일 알고리즘 문제풀이 문제 성격 유형 검사 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 def solution(survey, choices): answer = [] board = {'R':0, 'T':0, 'C':0, 'F':0, 'J':0, 'M':0, 'A':0, 'N':0} n = len(survey) for i in range(n): idx = survey[i] if choices[i] < 4: board[idx[0]] += abs(4-choices[i]) elif choices[i] >4: board[idx[1]] += (choices[i]-4) if board['R'] >= board['T']: answer.append('R') else: answer.append('T') if board['C'] >= board['F']: answer.append('C') else: answer.append('F') if board['J'] >= board['M']: answer.append('J') else: answer.append('M') if board['A'] >= board['N']: answer.append('A') else: answer.append('N') return ''.join(answer) 각 경우를 딕셔너리를 이용했다. 점수를 그대로 더해줘선 안되고 알맞게 변환해줘야 하는 부분이 조금은 신경써야할 부분. ...

2023년 12월 22일 · 1 분 · 배준수

파이썬 알고리즘 : 약수의 합

2023년 12월 21일 알고리즘 문제풀이 문제 약수의 합 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 def solution(n): answer = 0 for i in range(1,int(n**(0.5))+1): if not n%i: answer += (i+n//i) if i == n//i: answer -= i return answer 공약수는 대칭이기 때문에 절반만 반복해주었다. 단 제곱수는 똑같은 수가 2번 더해지니 해당 부분만 뺴주었다. ...

2023년 12월 21일 · 1 분 · 배준수

파이썬 알고리즘 : 바탕화면 정리

2023년 12월 19일 알고리즘 문제풀이 문제 숫자 블록 난이도 Lv.2 코드 첫 생각 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def solution(begin, end): answer = [] for n in range(begin,end+1): if n == 1: answer.append(0) elif not n%2: answer.append(n//2) else: for i in range(3,n//2): if not n%i: answer.append(n//i) print(n,n//i) break else: answer.append(1) return answer 최대공약수와 관련된 문제라고 생각했다. 최초 0으로 설정되있는 각 숫자는 1부터 하나씩 업데이트되겠지만, 마지막으로 업데이트될 때는 최대공약수로 될 것이다. 따라서 짝수는 절반값으로 된다. 2는 1, 4는 2, 6은 3, 8은 4 가 그 예시이다. 문제는 홀수였는데.. 홀수는 2로 나눠질 수 없는 것은 확실하니 3부터 1씩 커지면서 나누어주었다. 나누어 떨이질때, 그 몫이 최대 공약수이다. 하지만 이 경우가 자기 자신 뿐이라면 그때는 소수이므로 1로 설정해줬다. ...

2023년 12월 19일 · 3 분 · 배준수

파이썬 알고리즘 : 숫자의 표현

2023년 12월 18일 알고리즘 문제풀이 문제 숫자의 표현 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 def solution(n): answer = 1 if n == 1 or n == 2: return answer tmp = 3 while tmp <= n: if not n%tmp: answer += 1 tmp += 2 return answer 처음엔 DP로 생각했다. 생각하다보니, DP 라면 이전 것들이 계속 더해지는 형태라는 의미인데, 결국 숫자가 너무 커질 것이라는 생각이 들었다. 따라서 DP를 이용하는 문제라면 어떤 수로 나눈 나머지를 기록하도록 문제가 나왔을거라고 생각이 들어서 DP가 아닌 규칙성을 찾기로 하였다. 홀수의 경우 절반으로 나눈 몫과 그 몫의 1을 더한 경우가 항상 존재한다. 예를 들어, 15일 때 절반으로 나눈 몫은 7임. 1은 더한 값 8과 함께 7+8=15 로 표현될 수 있다. 이 규칙은 모든 홀수에게 적용되지만, 모든 짝수에게는 적용될 수 없다. 연속된 두 개의 수는 하나는 홀수고 하나는 짝수기 때문에 결과가 홀수로만 나타나기 때문이다. 그래서 홀수 일 떄만 생각하면 된다고 판단하였다. 짝수일 떄는 0일 것이라고 생각했지만, 연속된 수는 1개만 있어도 되기 떄문에, 어떤 자연수든 자기 자신 1개로만 표현될 수 있다고 생각하여 짝수일 때는 항상 1을 반환하게 만들었다. 그 외의 홀수는 홀수로 나누면 된다고 생각했다. 예시에서 15는 4가지 경우가 있다. 15, 7+8, 4+5+6, 1+2+3+4+5 이 중 앞에 15와 7+8은 예외적인 경우로 따져서 규칙성에서 배제하였다. 1개로 나타내는 수는 앞서 말했듯 누구에게나 적용되는 규칙이고, 7+8은 홀수라면 무조건 적용되는 규칙이기 때문이다. 즉 4+5+6과 1+2+3+4+5 가 15가 가지는 규칙인데, 총 더해지는 숫자의 갯수가 홀수개라고 생각했다. 가운데 수를 기준으로 양쪽에 하나씩, 두개씩, 세개씩 붙는 규칙이라고 파악했다. (2n+1)로 나누었을떄 나누어 떨어지면 된다. 15는 3,5로 나누어떨어지니 저 2개가 규칙이 생긴 것이다. 같은 논리로, 17과 19는 그 다음 홀수인 7로 나누어 떨어지지 않기 떄문에 15와 같은 갯수를 가질 것이다. 반면 21은 7로 나누어 떨어지기 떄문에 한 가지 경우가 추가될 것이고, 그 이후 9로 나누어 떨어지는 수가 나타나면 또 추가될 것이다. 여기서 일부 예외가 발생하였는데, 짝수를 배제한 것이 잘못되었다. 예를 들어 1+2+3은 6이다. 내가 세운 가설에 의하면 6은 연속된 수를 6 자기 자신을 제외하곤 없지만, 막상 실제로는 존재한다. 따라서 짝수 홀수와 상관없이 (2n+1)로만 나누어지면 내가 만든 규칙에 적용될 수 있다고 생각하여 짝수, 홀수를 따지지 않았더니 해결되었다. ...

2023년 12월 18일 · 2 분 · 배준수

파이썬 알고리즘 : 바탕화면 정리

2023년 12월 15일 알고리즘 문제풀이 문제 바탕화면 정리 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def solution(wallpaper): answer = [] files_x = [] files_y = [] n = len(wallpaper) m = len(wallpaper[0]) for i in range(n): for j in range(m): if wallpaper[i][j] == '#': files_x.append(i) files_y.append(j) answer.append(min(files_x)) answer.append(min(files_y)) answer.append(max(files_x)+1) answer.append(max(files_y)+1) return answer 처음엔 보고 조금 겁먹었지만 의외로 한번에 풀려버렸다. 존재하는 파일들을 모두 포함하는 드래그 중 가장 거리가 짧은 것을 찾기 위해 DFS나 BFS를 이용해야하나? 라는 생각을 했었다. 하지만 결국 존재하는 파일들의 x 좌표 값중 최솟값과 최댓값, y 좌표 중 최솟값과 최댓값만 찾으면 해결되는 문제였다. 조금 유의할 것은, 최댓값의 좌표에는 +1을 해주어야 한다. 파일의 좌측 상단 모서리를 기준으로하기 때문에 파일을 포함시키기 위해선 파일의 우측 하단 모서리까지 포함해야 한다. ...

2023년 12월 15일 · 1 분 · 배준수

파이썬 알고리즘 : 나머지가 1이 되는 수 찾기

2023년 12월 14일 알고리즘 문제풀이 문제 나머지가 1이 되는 수 찾기 난이도 Lv.1 코드 1 2 3 4 5 def solution(n): answer = 0 for i in range(2,n): if not (n-1)%i: return i

2023년 12월 14일 · 1 분 · 배준수