본문 바로가기

Algorithm/프로그래머스 연습 문제

(53)
프로그래머스 / 코딩 테스트 / 전화번호 목록 문제 설명 문제 해결 굳이 이 문제를 해시를 써서 풀 필요는 없다고 생각했다. 입력으로 들어온 문자열 리스트를 정렬한 후, 이중 반복문을 통해 접두어인 경우가 있는지 확인해줬다. hash를 쓰지 않았는데도 테스트를 모두 통과했다. def solve(phone_book): phone_book.sort() for n in phone_book: temp = phone_book temp.remove(n) for t in temp: if n == t[0:len(n)]: return False return True
프로그래머스 / 코딩 테스트 / N개의 최소공배수 문제 설명 문제 해결 두 수의 최소공배수를 반복적으로 구하다 보면 n 개의 숫자의 최소공배수를 구할 수 있다. 최대공약수를 구하기 위해 유클리드 호제법을 사용할 수 있지만 math 라이브러리를 사용하는 것이 더 간편하다. import math def lcm(x, y): return x * y // math.gcd(x,y) def solve(arr): while len(arr) != 1: arr.append(lcm(arr.pop(), arr.pop())) return arr[0] def solution(arr): answer = solve(arr) return answer
프로그래머스 / 코딩 테스트 / JadenCase 문자열 만들기 문제 설명 문제 해결 공백을 기준으로 문자열을 나누고 문자열만 존재한다면 첫 번째 글자는 대문자로 만들고 두 번째 글자부터 전부 소문자로 만들어주면 된다. def solve(s): res = s.split(" ") for i in range(len(res)): if res[i].isalpha(): res[i] = res[i][0].upper() + res[i][1:].lower() return " ".join(res) def solution(s): answer = solve(s) return answer
프로그래머스 / 코딩 테스트 / 행렬의 곱셈 문제 설명 문제 해결 선형대수를 배울 때 행렬곱에 대해서 배운 적이 있다. [스크랩] 행렬이란 무엇인가?- 선형대수.벡터와의 관계 선형대수란 무엇인가? [행렬.벡터와의 관계] -재능있는 대한민국 고딩들을 위해- 선형대수란 말그대로 선형대수다. 선형은 곧 직선이요 대수는 곧 방정식이다. 곧, 직선방정 blog.daum.net m * n, n * r 크기의 행렬을 곱하면 m * r 크기의 행렬이 나온다. 첫 번째 행렬의 행 벡터들과 두 번째 행렬 열 벡터들을 내적하여 새로운 행렬을 구성한다. 두 번째 행렬의 행과 열을 바꿔준다. [파이썬] 이차원 리스트 행과 열을 쉽게 바꾸기 다음과 같은 이차원 리스트가 있다고 가정하자. mylist = [ [1,2,3], [4,5,6], [7,8,9] ] 이차원 리스트 행..
프로그래머스 / 코딩 테스트 / 올바른 괄호 문제 설명 문제 해결 시도 반복적으로 '()' 문자열만 제거하면 사실상 ')' 혹은 ') ...' 관련 문자열 밖에 안 남을 것이다. find 함수를 이용해 '()' 문자열이 존재하는지 파악하고 replace 함수로 반복적으로 지워주는 코드를 작성했다. 정확성 테스트는 모두 통과했지만 효율성 테스트는 하나도 통과하지 못했다. def solve(s): while s.find('()') != -1: s=s.replace('()',"") return (len(s)
프로그래머스 / 코딩 테스트 / 튜플 문제 설명 문제 해결 일단 입력으로 여러 집합이 담긴 집합을 표현한 문자열을 준다. 즉 해당 문자열들을 파싱해야 한다. 파싱이 완료되면 정렬되지 않은 리스트를 원소의 길이에 따라서 정렬해줘야 한다. 리스트와 리스트 사이의 '-' 연산자는 지원되지 않는다. 리스트를 집합으로 전환하여 차집합을 구하고 다시 리스트로 구하여 해당 숫자에 접근할 수 있도록 인덱싱한다. def solve(s): s = s.split('},') for i in range(len(s)): s[i] = s[i].replace('{','') s[i] = s[i].replace('}','') s[i] = [int(x) for x in s[i].split(',')] s = sorted(s,key=lambda x : len(x)) res = ..
프로그래머스 / 코딩 테스트 / 멀쩡한 사각형 문제 설명 문제 해결 규칙을 알아내야 풀 수 있는 문제이다. 5 * 3 크기의 직사격형이다. 대각선이 1 * 1 크기의 정사각형 7개를 지나간다. 8 * 12 크기의 직사각형이다. 대각선이 1 * 1 크기의 정사각형 16개를 지나간다. 5 * 4 크기의 직사각형이다. 대각선이 1 * 1 크기의 정사각형 8개를 지나간다. 2 * 8 크기의 직사각형이다. 대각선이 1 * 1 크기의 정사각형 8개를 지나간다. 직사각형의 가로의 길이를 W, 세로의 길이가 H로 정의되어 있고 대각선이 지나는 1 * 1 크기의 정사각형의 개수는 W + H한 값과 상당히 근사하게 값이 나오고 있었다. 3시간 정도 직사각형과 대각선을 그리고 패턴을 찾아본 결과 개수가 W + H - gcd(W,H)라는 결론을 얻게 되었다. (선의 두께..
프로그래머스 / 코딩 테스트 / 2016년 문제 설명 문제 해결 네이버 캘린더 앱에 들어가서 2016년 각 월의 일이 얼마나 있는지 파악한다. 날이 얼마나 지났는지 계산을 하여 나머지 연산을 이용해 몇요일이 지났는지 구한다. def solve(a, b): res = ("FRI","SAT","SUN","MON","TUE","WED","THU") day = (31, 29, 31, 30, 31,30, 31, 31, 30, 31, 30, 31) return res[(((sum(day[:a]) - (day[a-1] - b)) % 7) -1)] def solution(a, b): answer = solve(a,b) return answer 물론 억지로 한 줄을 만들 수 있다. def solve(a, b): return ("FRI","SAT","SUN","M..
프로그래머스 / 코딩 테스트 / K번째 수 문제 설명 문제 해결 문제에서 요구하는 데로 commands를 이용해 array를 인덱싱하여 정렬후 원소를 추출하면 된다. comprehension을 이용하면 한 줄로 풀 수 있다. def solve(array, commands): return [sorted(array[command[0]-1:command[1]])[command[2]-1] for command in commands] def solution(array, commands): answer = solve(array, commands) return answer
프로그래머스 / 코딩 테스트 / 완주하지 못한 선수 문제 설명 문제 해결 hash를 사용해본 적이 없어서 다른 해결 방법을 고민해봤다. "한 명의 선수"를 제외하고는 다 완주했다. 동명이인이 있을 수도 있다. 완주자 명단과 참가자 명단의 크기 차이는 1이다. 명단들을 같은 기준으로 정렬하고 각 원소들을 비교한다. 명단이 같은 기준으로 정렬되었기 때문에, 동명이인이나 누락되지 않는 한 각 원소들의 위치는 똑같을 것이다. 맨 마지막에 동명이인이나 누락자가 있을 수도 있으니까 리스트를 다 순회하고도 return문에 접근하지 않으면 참가자의 마지막 원소를 반환한다. def solve(participant, completion): participant = sorted(participant) completion = sorted(completion) for i in ..