알고리즘 풀이/프로그래머스 109

[Level 2] 올바른 괄호

programmers.co.kr/learn/courses/30/lessons/12909 코딩테스트 연습 - 올바른 괄호 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 ()() 또는 (())() 는 올바른 괄호입니다. )()( 또는 (()( 는 올바르지 않은 괄호 programmers.co.kr 문제요약 입력되는 괄호들의 쌍이 맞는지 확인을 한다. 접근 스택을 이용해 여는 괄호가 들어오면 스택에 넣고 닫는 괄호가 들어오면 POP을 한다. 이때 스택이 비어있는데 닫는괄호가 들어오면 False를 반환하고 모든 문자열을 검색했는데 스택이 비어있지 않는다면 False를 반환한다. 구현 def solution(s): answer = True..

[Level 2] 더 맵게

programmers.co.kr/learn/courses/30/lessons/42626 코딩테스트 연습 - 더 맵게 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같 programmers.co.kr 문제요약 모든 음식을 스코빌지수 K이상으로 만들기 위해서 스코빌지수가 제일 낮은 음식과 두 번째로 낮은 음식을 일정한 규칙응로 섞는다. 모든 음식의 스코빌지수가 K이상이기 위해서는 몇 번을 섞어야 하는지 구하라 단 모든 음식을 K이상으로 만들지 못할 때는 -1을 출력한다. 접근 힙으로 분류가 되었기 때문에 Python의 heapq 모듈을 사용해보았다. 힙에 넣게 ..

[Level 2] 가장 큰 수

문제 0 또는 양의 정수가 주어졌을 때 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내자. 입력 0 또는 양의 정수가 담긴 배열 numbers가 입력된다. 출력 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 출력한다. 접근 처음에 numbers에 담긴 숫자들을 문자형으로 바꾸고 리스트에 저장 한다음에 내림차순으로 정렬하여 출려하면 될 줄 알았지만 예외 케이스가 많았다. 먼저 34, 30, 3으로 정렬이 되었고 이대로 출력하면 34303이되어 가장 큰 수인34330이 나오지 않는다. 따라서 현재 문자와 다음 인덱스의 첫 글자가 같을 때 현재 문자의 두 번째 글자가 0이면 스왑을 해주었는데 입력되는 수는 1000이하였기 때문에 한계가 있었다. 이를 해결하는 것이 문자형으로 변경된 리스트..

[Level 2] 구명보트

문제 무인도에 갇힌 사람들을 구명보트로 구출하려고 한다. 구명보트에는 최대 2명씩 밖에 탈 수 없고, 무게제한도 있다. 구명보트를 최대한 적게 사용하여 모든 사람을 구출하라. 입력 사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit이 입력된다. 사람의 몸무게는 40kg이상 240kg이하 구명보트의 무게제한은 40kg이상 240kg이하 출력 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 출력한다. 접근 최대한 적게 구명보트를 사용하려면 한 번에 많은 사람을 태워야하고 그러기위해서는 몸무게가 작은사람과 몸무게가 큰사람을 비교해보면서 제한 이하라면 이동시켜야한다. 그리고 문제에서 주어진 조건들을 모두 공격적으로 살펴 볼 필요가 있다. 그냥 주어지는 조건은 없다. 여기서 2명..

[Level 2] 전화번호 목록

programmers.co.kr/learn/courses/30/lessons/42577 코딩테스트 연습 - 전화번호 목록 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조 programmers.co.kr 접근 in 연산을 통해 파악하려고 했으나 몇몇 케이스에서 실패를 하였다. 정렬을 해야할 필요가 있었고 오름차순으로 정렬을 한다면 정수형으로 봤을 때 맨 앞 글자가 작은 순서대로 앞에온다. 만약 맨 앞 글자가 같다면 그 다음 수를 보기 때문에 in 연산을 사용할 수 있게된다. 1233, 33 이라는 케이스가 있을 때 문자열의 길이를 오름차순으로 정렬한다면 33이 1233안에..

[Level 3] 2xn 타일링

programmers.co.kr/learn/courses/30/lessons/12900?language=python3 코딩테스트 연습 - 2 x n 타일링 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 programmers.co.kr 접근 백준에서도 풀어봤던 문제다. 그런데 dp로 접근했을 때 시간초과가 발생하였고 다른 사람의 풀이를 참고하였다. 구현 현재 n의 경우의 수는 n-1, n-2의 경우의 수와 같은데 아래와 같이 구현할 수도 있다는 것을 알았다. dp1에는 현재 n의 경우의 수에 해당하고 dp2는 다음 n의 경우의 수가 담기게된다. def solutio..

[Level 1] 비밀 지도

programmers.co.kr/learn/courses/30/lessons/17681 코딩테스트 연습 - [1차] 비밀지도 비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다 programmers.co.kr 접근 문제를 봤을 때 " | " 연산자가 생각이 났다. 두 개의 배열의 각각 원소를 OR 연산을 하여 맵을 출력하면 됐다. 구현 arr1과 arr2에 있는 같은 인덱스의 숫자끼리 OR연산을 하여 bin()을 통해 2진수로 변환한다. 그렇다면 앞에 0b가 붙은 문자형으로 변환이 된다. 이때 인덱스 2부터 검사를 하여 1이면 # 0이면 공백을 해주는데 전달받은 n자리를 맞..

[Level 1] 2016년

programmers.co.kr/learn/courses/30/lessons/12901 코딩테스트 연습 - 2016년 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까 programmers.co.kr 접근 2016년의 특정 달의 특정 일을 입력받아 요일을 출력해야 한다. 이를 위해 각 달이 몇 일까지 있는지 알면 편하다. 입력받은 월 전까지의 일 수를 모두 더한다음 보고자하는 일수 b를 더하고 -1을 해준다. 여기에 7로 나눈 나머지를 취하여 days의 인덱스로 활용한다. 1월 1일부터 5월 24일까지 더한 일수를 7로 나눈 나머지가..

[Level 1] 문자열 내 마음대로 정렬하기

programmers.co.kr/learn/courses/30/lessons/12915 코딩테스트 연습 - 문자열 내 마음대로 정렬하기 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1 programmers.co.kr 접근 파이썬의 sort()에 key값을 넣어서 정렬을 하였다. 만약에 n번째 숫자가 같다면 사전순으로 정렬해야하기 때문에 먼저 기본적인 sort를 진행한 후에 key값을 추가하여 n번째 글자로 정렬되도록 하였다. 구현 def solution(strings, n): answer = [] strings.sort() s..

[Level 1] 크레인 인형 뽑기

programmers.co.kr/learn/courses/30/lessons/64061?language=python3 코딩테스트 연습 - 크레인 인형뽑기 게임 [[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4 programmers.co.kr 접근 스택을 이용하면 쉽게 풀 수 있을 것이라고 생각했다. 구현 스택과 보드의 길이를 생성한다. 이후 크레인의 움직이는 정보가 담긴 moves에서 정수 x를 -1로 한 후에 세로 축 탐색을 진행한다 만약 숫자가 나오고 스택이 비었다면 바로 스택에 넣고 스택이 비어있지 않다면 스택의 맨 위와 현재 정수를 비교하여 같다면 최종해 +2 (한 번에 2개가 터짐) 이후 스택의 to..

728x90
반응형