algorithm
28 posts
2020 카카오 - 괄호 변환

문제 설명 및 제한 조건 링크참고 - 프로그래머스 대략 1시간 사용 구현방법이 상세하게 적혀있어서 ‘어? 이렇게하면 풀린다고? 그렇구만… 왜지?’ 하면서 구현했다. [우아한테크세미나 - 190425 TDD 리팩토링 by 자바지기 박재성님 ](https://www.youtube.com/watch?v=bIeqAlmNRrA&t=2003s){:target=“_blank”} 에 나온대로 메서드를 최대한 나누려고 노력 지금은 깊이 2단계 까지는 보인다. 개선할 것 removeAndReverse 메서드를 앞과 뒤를 제거하는 것과 가운데 내용을 뒤집는 메서드로 쪼개는게 낫겠다. 과 를 비교하는 내용이 많이 등장하는데 실수를 방지하기 위해서 , 메서드를 만들어도 되겠다. balancedBracket 메서드의 가장 밑 은 논리적으로 실행될 수 없다. 균형잡힌 괄호의 index값을 리턴하게 하면 되려나… 고민해보자. 깊이 2인 메서드 1로 줄여보기 개선한 코드

2019년 9월

1번문제 물건과 박스배열이 주어질 때 박스에 넣을 수 있는 물건의 최대 갯수 구하기 2번문제 비숍의 위치 배열이 주어질 때 비숍이 갈 수 있는 곳을 제외한 체스판 위치의 갯수 구하기 비숍이 갈 수 있는 곳을 판단하는 판별식 구현에 1시간 가량 씀(dfs로 해야하나 한번에 풀 수 있는 식이 있나 고민하는 시간이 컸다) 여러개의 비숍이 위치할 때 중복을 제거하는 로직 추가가 필요할 것 같다. 이 문제에서는 boolean 배열 만들지 않아도 될 것 같다. 체스판의 위치가 필요한게 아니라 갯수만 리턴하면 되니까. 3번문제 남은 30분동안 못 풀고 끝났는데 dp를 공부하고나서 다시 푸니까 너무 빨리 풀려버림… 아쉽다 dp공부는 이 블로그를 참고 KHAN(광혁) - 백준 2579번 계단오르기 문제는 이 문제를 1차원 배열로 줄여놓은 것 백준 9465번 - 스티커 난이도가 높지 않았는데 시간내에 못풀어서 아쉬움이 크다. 그래도 이 정도로 성장했구나 확인할 수 있었던 시간이었다.

LV2. 큰 수 만들기

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 maxIndex를 -1로 초기화 했다는게 너무 마음에 안든다. 참고 프로그래머스

LV2. 조이스틱

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 알파벳을 최소 이동거리로 치환하는 로직 오른쪽으로 계속 이동하면서 가는게 최소이동거리인지 오른쪽으로 갔다가 다시 왼쪽으로 백해서 가는게 최소이동 거리인지 판단해야함 테스트케이스 11 에서 한참 막혀서 확인해보니 “AAABAAA” 가 4 인경우를 생각 안했음. 필요한 변수가 총 4개 였음… 더 줄일 수 있을 것 같은데… 참고 프로그래머스

LV2. 타겟넘버

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 손으로 푼 내용을 어떻게 구현해야할지 모르겠어서 재귀함수 응용법 공부(프로그래머스 - 영리한 프로그래밍을 위한 알고리즘) 3번째 인자에 하나는 +, 하나는 -를 넣으면 된다는 생각을 하는게 어려웠다. 참고 프로그래머스

LV2. 소수만들기

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 재귀함수 사용해서 경우의 수 조합(Combination) 배열의 합을 리스트로 담아놓고 소수 판별 후 카운트 소수 판별 시간복잡도 줄이기(에라토스테네스의 체) 참고 프로그래머스

LV2. 카펫

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 후기 규칙성 찾기 2차방정식 나옴 근의공식사용 중학교 수학을 지금 쓸 줄은 몰랐다… 완전탐색으로 푸는 방법은 모르겠다. 참고 프로그래머스

LV2. 쇠막대기

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 다른 사람의 풀이 배운점 나는 시작과 끝 index를 구한다음 그 안에 있는 레이저의 갯수를 구하는 방법밖에 생각이 안남… 그러다보니 시간복잡도는 O(n2)에다가 매번 arr을 넘겨주고 있어서 굉장히 비효율적이다. 다른사람의 풀이를 보면 레이저를 만날 때 왼쪽 막대기의 갯수를 더해간다. O(n)으로 끝남. split이나 charArray로 안바꾸고 시작해도 된다. 참고 프로그래머스

LV2. 가장 큰 수

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 참고 프로그래머스

LV2. 프린터

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 참고 프로그래머스

LV2. H-Index

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 참고 프로그래머스

LV1. K번째 수

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 참고 프로그래머스

LV3. 베스트앨범

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 참고 프로그래머스

LV2. 전화번호 목록

문제 설명 및 제한 조건 링크참고 - 프로그래머스{: target=“_blank”} Google 새창에서 열려랴 얍 내 풀이 참고 프로그래머스

LV2. 기능개발

문제 설명 및 제한 조건 링크참고 - 프로그래머스 내 풀이 개선해야할 게 많다… 참고 프로그래머스

LV1. 완주하지 못한 선수

문제 설명 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한 조건 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다. 입출력 예 participant completion return [“leo”, “kiki”, “eden”] [“eden”, “kiki”] “leo” [“leo”, “kiki”, “leo”] [“leo”, “kiki”] “leo” [“leo”, “kiki”, “leo…

LV2. 위장

문제 설명 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다 종류 이름 얼굴 동그란 안경, 검정 선글라스 상의 파란색 티셔츠 하의 청바지 겉옷 긴 코트 스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요. 제한 조건 clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다. 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다. 같은 이름을 가진 의상은 존재하지 않습니다. clothes의 모든 원소는 문자열로 이루어져 있습니다. 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 ’_’ * 로만 이루어져 있습니다. 스파이는 하루에 최소 한…

LV2. 스킬트리

문제 설명 선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다. 예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다. 위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다. 선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요. 제한 조건 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다. 스킬 순서와 스킬트리는 문자열로 표기합니다. 예를 들어, C → B → D 라면 CBD로 표기합…

코딩테스트 기록

거스름돈 노가다로 품. 자바의 정석에 있는 문제인데 생각이 안나고 시간도 없어서 ㅠㅠ 개선해보자 int형 배열을 선언하고 거스름돈의 단위를 넣은 다음 배열의 값을 하나씩 꺼내면서 money 를 값으로 나눈 값을 차례대로 출력하고 money에 그 동전 단위로 나눈 나머지값으로 재설정해준다. 369 박수 친 횟수 세기 13을 입력받으면 1부터 13까지 연속되는 숫자를 스트링으로 다 몰아넣고 그 중에서 3, 6, 9가 몇개인지 셈 string -> char로 바꾸는 과정 없이도 풀 수 있을 것 같음 암호풀기 abccbd 라는 암호가 있으면 (cc가 인접해 있으니) abbd로 바뀌고 (다시 bb가 인접해 있으니) 결국 ad가 최종 결과가 되는 암호풀기 ArrayList를 스택처럼 사용하고 String으로 옮김 청개구리 알파벳 A는 Z로, Z는 A로 바뀜 a는 z로, z는 a로 바뀜 대문자, 소문자별 유니코드 찾아보고 z,Z 보다 1큰 숫자에서 자기자신의 유니코드를 뺌 대문자, 소문자를 한…

LV2. 탑

문제 설명 수평 직선에 탑 N대를 세웠습니다. 모든 탑의 꼭대기에는 신호를 송/수신하는 장치를 설치했습니다. 발사한 신호는 신호를 보낸 탑보다 높은 탑에서만 수신합니다. 또한, 한 번 수신된 신호는 다른 탑으로 송신되지 않습니다. 예를 들어 높이가 6, 9, 5, 7, 4인 다섯 탑이 왼쪽으로 동시에 레이저 신호를 발사합니다. 그러면, 탑은 다음과 같이 신호를 주고받습니다. 높이가 4인 다섯 번째 탑에서 발사한 신호는 높이가 7인 네 번째 탑이 수신하고, 높이가 7인 네 번째 탑의 신호는 높이가 9인 두 번째 탑이, 높이가 5인 세 번째 탑의 신호도 높이가 9인 두 번째 탑이 수신합니다. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 레이저 신호는 어떤 탑에서도 수신할 수 없습니다. 맨 왼쪽부터 순서대로 탑의 높이를 담은 배열 heights가 매개변수로 주어질 때 각 탑이 쏜 신호를 어느 탑에서 받았는지 기록한 배열을 return 하도록 solution 함수를 작성해주…

LV1. 잃어버린 체육복 (탐욕법)

문제 설명 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요. 제한 조건 전체 학생의 수는 2명 이상 30명 이하입니다. 체육복을 도난당한 학생의 수는 2명 이상 n명 이하이고 중복되는 번호는 없습니다. 여벌의 체육복을 가져온 …

LV1. 문자열 내림차순으로 배치하기

문제 설명 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다. 제한 조건 str은 길이 1 이상인 문자열입니다. 입출력 예 s return “Zbcdefg” “gfedcbZ” 풀이 참고 프로그래머스

LV1. 나누어 떨어지는 숫자 배열

문제 설명 array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요. 제한 조건 arr은 자연수를 담은 배열입니다. 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다. divisor는 자연수입니다. array는 길이 1 이상인 배열입니다. 입출력 예 arr divisor return [5,9,7,10] 5 [5,10] [2,36,1,3] 1 [1,2,3,36] [3,2,6] 10 [-1] 풀이 참고 프로그래머스

LV1. 자릿수 더하기

문제 설명 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한 조건 N의 범위 : 100,000,000 이하의 자연수 입출력 예 N return 123 6 987 24 풀이 참고 프로그래머스

(프로그래머스 모의테스트) 배열 중복

[문제] 길이가 n인 배열에 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는지를 확인하려고 합니다. 1부터 n까지 숫자가 중복 없이 한 번씩 들어 있는 경우 true를, 아닌 경우 false를 반환하도록 함수 solution을 완성해주세요. 제한 조건 배열의 길이는 10만 이하입니다. 배열의 원소는 0 이상 10만 이하인 정수입니다. 입출력 예 arr result [4, 1, 3, 2] true [4, 1, 3] false 입출력 예 설명 입출력 예 #1 입력이 [4, 1, 3, 2]가 주어진 경우, 배열의 길이가 4이므로 배열에는 1부터 4까지 숫자가 모두 들어 있어야 합니다. [4, 1, 3, 2]에는 1부터 4까지의 숫자가 모두 들어 있으므로 true를 반환하면 됩니다. 입출력 예 #2 [4, 1, 3]이 주어진 경우, 배열의 길이가 3이므로 배열에는 1부터 3까지 숫자가 모두 들어 있어야 합니다. [4, 1, 3]에는 2가 없고 4가 있으므로 false를 반환하면 됩니다…

LV1. 핸드폰 번호 가리기

핸드폰 번호 가리기 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건 s는 길이 4 이상, 20이하인 문자열입니다. 입출력 예 phone_number return 01033334444 027778888 풀이 [답] 배운 것 len함수 활용 - (마이너스)를 사용하여 문자열 뒤에서 슬라이스하기 정말 기초적인 내용만 가지고도 풀 수 있는 진짜 실용적인 문제! 참고 프로그래머스

LV1. 같은 숫자는 싫어

같은 숫자는 싫어 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 배열 arr에서 제거 되고 남은 수들을 return 하는 solution 함수를 완성해 주세요. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를들면 arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다. arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다. 배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요. 제한사항 배열 arr의 크기 : 1,000,000 이하의 자연수 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수 입출력 예 arr answer [1,1,3,3,0,…

LV1. 가운데 글자 가져오기

가운데 글자 가져오기 단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다. 재한사항 s는 길이가 1 이상, 100이하인 스트링입니다. 입출력 예 s return “abcde” “c” “qwer” “we” 풀이 python3 참고 프로그래머스