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

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 분 · 배준수

파이썬 알고리즘 : 멀리 뛰기

2023년 12월 12일 알고리즘 문제풀이 문제 멀리뛰기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 def solution(n): answer = 0 dp = [0 for _ in range(n+1)] for i in range(1,n+1): if i == 1: dp[i] = 1 elif i == 2: dp[i] = 2 else: dp[i] = (dp[i-1] + dp[i-2])%1234567 answer = dp[n] return answer n번째 칸은 ...

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

파이썬 알고리즘 : 땅따먹기

2023년 12월 11일 알고리즘 문제풀이 문제 땅따먹기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def solution(land): n = len(land) answer = 0 dp = [[0 for _ in range(4)] for _ in range(n)] dp[0] = land[0] def check(next_row,next_col): arr = [] for i in range(4): if i == next_col: continue arr.append(dp[next_row-1][i]) return max(arr) x = 1 while x < n: for i in range(4): dp[x][i] = check(x,i) + land[x][i] x += 1 answer = max(dp[-1]) return answer 각 행에는 4개의 열이 있다. 각 열에 올 수 있는 방법의 경우는 3가지이다. 예를 들어 2행 0열에 오는 방법은 2행 1열, 2행 2열, 2행 3열에서 오는 것이다. 이러한 원리를 바탕으로 DP를 설정했다. ...

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

파이썬 알고리즘 : 로또의 최고 순위와 최저 순위

2023년 12월 08일 알고리즘 문제풀이 문제 로또의 최고 순위와 최저 순위 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def solution(lottos, win_nums): def translate(p): if p >=2: return 7-p else: return 6 answer = [] cnt = 0 unknown = 0 for num in lottos: if not num: unknown += 1 continue if num in win_nums: cnt += 1 continue max_match = cnt + unknown min_match = cnt answer.append(translate(max_match)) answer.append(translate(min_match)) return answer 확실한 것을 통해 최저 순위를 확정지을 수 있고 정해지지 않은 수가 모두 맞는다고 가정하면 최고 순위도 알 수 있다. ...

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

파이썬 알고리즘 : 문자열을 정수로 바꾸기

2023년 12월 07일 알고리즘 문제풀이 문제 문자열을 정수로 바꾸기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 def solution(s): if s[0] == '-': answer = int(s[1:]) * -1 elif s[0] == '+': answer = int(s[1:]) else: answer = int(s) return answer

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