알고리즘 공부 7

[세무민의 코딩일기] 프로그래머스 짝지어 제거하기 문제 풀이

이번 포스팅에서 다룰 문제는 2017년도 팁스타운에서 제공 된 짝지어 제거하기 문제입니다. 이 문제를 풀면서 시간복잡도와 deque의 사용의 장점을 알 수 있었습니다. 1. 문제설명 2. 입출력 예 설명 3. 문제 풀이 이번 문제는 처음에 구상했던 방법은 같은 값이 나오는 i, i+1값을 제거해주면 됩니다. 이 때 방법의 차이로 시간복잡도 문제에 봉착할 수 있습니다. 제가 처음 생각했던 것은 s = s[:count]+s[count+2:]와 같이 같은 문자가 연속으로 존재한다면 해당 값을 제거하고 다시 새로운 문자열로 만들어줬습니다. 이 방법을 이용했더니 시간복잡도에 초과가 되었고 곰곰히 생각한 끝에 deque를 생각했습니다. 말 그대로 deque과 반복문을 이용해서 연속으로 들어있는 값이 있다면 dequ..

세무민의 알고가자 : 프로그래머스 나머지 한 점 문제 풀이

이번에 풀 문제는 나머지 한 점! 대표적으로 코딩테스트를 보기 전 모의 테스트 시험 문제로 자주 출제된다. 문제 설명 및 입출력! 문제 풀이 이번 문제를 푼 방법은 결국에 사각형의 길이가 일치하지 않는 값만 찾으면 된다는 점에서 생각했다. 즉 2차원 배열에서 첫번째를 Frist, 두번째를 Last라고 가정할 때 Frist와 Last가 동일한 값이 존재하지 않는다면 그 값이 결국 나머지 한점이 된다. 결론적으로 문제를 푸는 방법은! 1. V를 Frist, Last로 분할하고 2. 반복문을 돌려서 중복되는 값이 없다면 그 값을 출력한다. 코드 def solution(v): frist, last = list(), list() for i in range(len(v)): frist.append(v[i][0]) l..

세무민의 알고가자 : 프로그래머스의 소수 만들기 문제 풀이

이번에 풀어 볼 문제는 소수 만들기! 이번 문제는 Summer/Winter Coding 2018년도 문제 중 1개라고 합니다. 무튼 풀어보죠 문제 설명 및 입출력 예시 풀이 이번 문제는 사실 itertools를 사용한다면 10분정도에 풀 수 있었던 문제라고 생각됩니다. 처음에는 당황했던 부분은 3개를 조합한 뒤 그 값이 소수인지 판별하는 것! 그렇지만 itertools에 있는 combinations을 이용한다면 쉽게 풀 수 있었습니다. combinations? 우선 combinations를 설명하면 조합이라고 생각하면 됩니다. 즉 배열에 존재하는 값을 선택하여 조합해주는 것을 말하죠 즉 arr[1,2,3] -> list(combinations(arr, 2))라고 가정하면 result = [1,2], [1..

세무민의 알고가자 : 프로그래머스 제일 작은 수 제거하기 문제 풀이

오늘 풀어 본 문제는 제일 작은 수 제거하기! 문제 설명 및 입출력 풀이 및 코드 이번 문제는 sort를 사용해도 무관한 문제이다. 사실 가장 좋은 방법은 정렬한 뒤 가장 작은 값을 제거해주면 끝! 결론적으로 문제에서 확인할 부분은! 1. 배열의 길이가 1이라면 -1을 리턴 2. 가장 작은 값을 제거해주면 끝! def solution(arr): result = 0 tempArr = [] for i in arr: tempArr.append(i) tempArr.sort() checkNumber = tempArr[0] if len(tempArr) == 1: return [-1] else: arr.remove(checkNumber) return arr 위에 코드처럼 구성했는데 새로운 배열에 기존 arr를 복사해..

세무민의 알고가자 : 프로그래머스 같은 숫자는 싫어 문제 풀기 [부제 : for와 while의 시간 차이]

오늘 풀어 볼 문제는 같은 숫자는 싫어! 사실 이 문제는 그냥 포스팅 할 생각이 없었지만 for문과 while문의 속도 차이로 문제 풀이가 달라져서 포스팅 하게 됬다. 문제 설명 & 입출력 예시 풀이 이번 문제는 set을 사용하면 안되는 문제! set은 중복되는 값을 다 제거하기 때문! 따라서 이번 문제는 while문이나 for문으로 접근하는 것이 중요합니다. 문제가 쉬워서 말 그대로 같은 값이면 continue를 해주면 되겠죠? 코드 def solution(arr): answer = [] count = 0 while len(arr) > 0: temp = arr[0] if len(answer) == 0: answer.append(temp) elif answer[count] == temp: arr = ar..

세무민의 알고가자 : 프로그래머스 이상한 문자 만들기 문제 풀기

오늘 풀어 볼 문제는 이상한 문자 만들기! 문제 설명 & 제한 사항 & 입출력 예시 문제 풀이 사실 이번 문제는 조금 이해가 안됬다. 문제가 어려워서 이해가 안된것이 아니라 쉬운데 왜 아스키코드로 접근하면 틀렸다고 하는지... 무튼 내가 접근했던 방법은 총 3가지! 1. 아스키 코드로 변환해서 대소문자를 변경해주기 2. str -> list -> str로 쪼개서 만들기 3. list 상태로 구분하기 3가지 중 정답은 3번이였다. 위에 문제를 접근하기 전 가장 먼저 체크해야 하는 부분은 홀수와 짝수를 구분해서 대소문자로 변경해주는 것인데 이는 X % 2 == 0이라는 조건이 만족한다면 대문자, 그렇지 않다면 소문자! 배열이 0부터 시작하기 때문에 잘 체크해야 한다. 무튼 아스키코드로 접근하려고 했던 방식은..

세무민의 알고가자 : 프로그래머스 폰켓몬 문제 풀기

오늘 풀어볼 문제는 폰켓몬! 바로 시작하겠습니다! 문제 설명 & 제한 사항 입출력 예시 풀이 우선 문제를 재대로 해석하지 않으면 어렵게 느낄 수 있습니다. 진짜 문제를 이해했다면 쉬운 문제라고 생각이 들더라구요! 위의 예를 잘 보시면 nums라는 배열의 총 개수 -> N 찾으려는 폰캣몬의 개수 -> N / 2 폰켓몬은 중복이 될 수 없다! 여기서 살짝 문제 푸는 방법을 아시겠죠? 결국에는 nums의 개수를 2로 나눈 값만큼 포켓몬을 찾되 중복되는 값이 아닌 최대값을 찾으면 됩니다. 여기서 포인트는 중복되는 값을 제거해준 값도 확인해주면 됩니다. 결론적으로 1. list -> 중복값 제거해주기 2. 개수 일치하는지 비교 코드 def solution(nums): result = len(nums) // 2 n..