목록공부/알고리즘 문제 (41)
빠에야는 개발중
1,2,4 세 개의 숫자만 쓰는 124나라가 있습니다.124나라에서 사용하는 숫자는 다음과 같이 변환됩니다.10진법의 1 → 110진법의 2 → 210진법의 3 → 410진법의 4 → 1110진법의 5 → 1210진법의 6 → 1410진법의 7 → 2110진법의 수 N이 입력될 때, 124나라에서 쓰는 숫자로 변환하여 반환해주는 change124 함수를 완성해 보세요. 예를 들어 N = 10이면 “41”를 반환해주면 됩니다.리턴 타입은 문자열입니다. 어렴풋이 떠오른 풀이 방법은 3으로 나누는 것이었다. 실제로 예시는 마치 3진수를 0을 3으로 바꾸고 3을 4로 바꾼 모습이기 때문이다. 그런데 한가지 문제가 있었는데, 그것은 1, 2, 4로만 숫자를 표시해야하기 때문에 3으로 나누어 떨어졌을 때 자리수를 ..
영희는 땅따먹기 게임에 푹 빠졌습니다. 땅따먹기 게임의 땅은 총 N행 4열로 나누어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 땅을 밟으면서 한 행씩 내려올 때, 영희는 각 행의 4칸 중 1칸만 밟으면서 내려올 수 있습니다. 땅따먹기 게임에는 같은 열을 연속해서 밟을 수가 없는 특수 규칙이 있습니다. 즉, 1행에서 (5)를 밟았다면, 2행의 (8)은 밟을 수가 없게 됩니다. 마지막 행까지 모두 내려왔을 때, 점수가 가장 높은 사람이 게임의 승자가 됩니다. 여러분이 hopscotch 함수를 제작하여 영희가 최대 몇 점을 얻을 수 있는지 알려주세요. 예를 들어 1 2 3 5 5 6 7 8 4 3 2 1 의 땅이 있다면, 영희는 각 줄에서 (5), (7), (4) 땅을 밟아 16점을 최고점으로 받을 수 있으..
1보다 큰 N개의 도시 중 한 곳에 공항을 지을 예정입니다. 사람들의 편의를 위해 공항으로부터 각 사람들까지의 도시간 이동 거리가 최소가 되는 도시에 짓기로 하였습니다. 편의상 도시는 일직선상에 놓여있다고 가정하며 좌표의 범위는 음수가 포함됩니다. 또한 좌표는 정렬되어 있지 않습니다. 직선상의 위치와 그 도시에 사는 사람들의 수가 주어질 때, 공항을 지을 도시의 위치를 반환해주는 함수 chooseCity 함수를 완성하세요. 거리가 같은 도시가 2개 이상일 경우 위치가 더 작은 쪽의 도시를 선택하면 됩니다. 예를 들어 다음과 같은 정보의 도시가 있다고 가정해 봅시다.위치123인구수523이 살 경우, 각각의 도시에 공항을 지었을 때의 사람들의 이동 거리는 8, 8, 12 이므로 1번 또는 2번에 지을 수 있..
O와 X로 채워진 표가 있습니다. 표 1칸은 1 x 1 의 정사각형으로 이루어져 있습니다. 표에서 O로 이루어진 가장 큰 정사각형을 찾아 넓이를 반환하는 findLargestSquare 함수를 완성하세요. 예를 들어12345XOOOXXOOOOXXOOOXXOOOXXXXX가 있다면 정답은12345XOOOXXOOOOXXOOOXXOOOXXXXX가 되며 넓이는 9가 되므로 9를 반환해 주면 됩니다. 처음에는 "모든 칸에서 각 길이만큼 가능한 정사각형을 구해서 최대값을 저장한다."라는 생각으로 n중 for문을 사용했는데 보기좋게 타임아웃이 났다. 그래서 좀 더 생각해보니 d[n,m]이 (n,m)의 최대 정사각형 크기라면 d[i-1,j-1], d[i, j-1], d[i-1, j]의 최소값 + 1이 d[i,j]값이 된..
자연수 N개로 이루어진 집합 중에, 각 원소의 합이 S가 되는 수의 집합은 여러 가지가 존재합니다. 최고의 집합은, 위의 조건을 만족하는 집합 중 각 원소의 곱이 최대가 되는 집합을 의미합니다. 집합 원소의 개수 n과 원소들의 합 s가 주어지면, 최고의 집합을 찾아 원소를 오름차순으로 반환해주는 bestSet 함수를 만들어 보세요. 만약 조건을 만족하는 집합이 없을 때는 배열 맨 앞에 –1을 담아 반환하면 됩니다. 예를 들어 n=3, s=13이면 [4,4,5]가 반환됩니다. (자바는 집합이 없는 경우 크기가 1인 배열에 -1을 담아 반환해주세요.) 주요 로직은 "합이 S가 되는 집합의 경우"를 구하는 것이기 때문에 bfs로 쉽게 구현할 수 있다. 다만 집합의 길이가 가변적이기 때문에 단순히 값을 집어넣지..
수학을 공부하던 민지는 재미있는 사실을 발견하였습니다. 그 사실은 바로 연속된 자연수의 합으로 어떤 숫자를 표현하는 방법이 여러 가지라는 것입니다. 예를 들어, 15를 표현하는 방법은 (1+2+3+4+5) (4+5+6) (7+8) (15) 로 총 4가지가 존재합니다. 숫자를 입력받아 연속된 수로 표현하는 방법을 반환하는 expressions 함수를 만들어 민지를 도와주세요. 예를 들어 15가 입력된다면 4를 반환해 주면 됩니다. 이번에도 다이나믹으로 풀려고 했다가 생각보다 더 쉬운 문제인 것을 깨닫고 선형으로 찾아서 풀었다.1부터 n까지 계속 더해가면서 1부터 시작하는 경우, 2부터 시작하는 경우, ... 이렇게 모두 계산하여 입력값과 같아지는 경우에만 answer를 더해주면 된다.123456789101..
야근 지수 회사원인 수민이는 많은 일이 쌓여 있습니다. 수민이는 야근을 최소화하기 위해 남은 일의 작업량을 숫자로 메기고, 일에 대한 야근 지수를 줄이기로 결정했습니다. 야근 지수는 남은 일의 작업량을 제곱하여 더한 값을 의미합니다. 수민이는 1시간 동안 남은 일 중 하나를 골라 작업량 1만큼 처리할 수 있습니다. 수민이의 퇴근까지 남은 N 시간과 각 일에 대한 작업량이 있을 때, noOvertime 함수를 제작하여 수민이의 야근 지수를 최소화 한 결과를 출력해 주세요. 예를 들어, N=4 일 때, 남은 일의 작업량이 [4, 3, 3] 이라면 야근 지수를 최소화하기 위해 일을 한 결과는 [2, 2, 2]가 되고 야근 지수는 22 + 22 + 22 = 12가 되어 12를 반환해 줍니다. dp로 풀려고 생각..
어떤 수 N(1≤N≤1,000,000) 이 주어졌을 때, N의 다음 큰 숫자는 다음과 같습니다.N의 다음 큰 숫자는 N을 2진수로 바꾸었을 때의 1의 개수와 같은 개수로 이루어진 수입니다.1번째 조건을 만족하는 숫자들 중 N보다 큰 수 중에서 가장 작은 숫자를 찾아야 합니다.예를 들어, 78을 2진수로 바꾸면 1001110 이며, 78의 다음 큰 숫자는 83으로 2진수는 1010011 입니다. N이 주어질 때, N의 다음 큰 숫자를 찾는 nextBigNumber 함수를 완성하세요. 다음 이진수 1의 개수가 같은 수가 logn 자리 내에서 계산되기 때문에 범위가 100만까지인 수는 아무리 길어도 19자리를 넘지 않는다. 그래서 차례로 반복문을 돌려서 계산해도 될 것이라고 생각했다. 조건만 제대로 체크해주면..
효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는 (1칸, 1칸, 1칸, 1칸) (1칸, 2칸, 1칸) (1칸, 1칸, 2칸) (2칸, 1칸, 1칸) (2칸, 2칸) 의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 출력하는 jumpCase 함수를 완성하세요. 예를 들어 4가 입력된다면, 5를 반환해 주면 됩니다. BFS를 사용하면 쉽게 풀리는 문제다. 듣고 있는 온라인 강의에서 나온 문제이기도 한데, 역시 직접 해보는게 더 공부가 된다.12345678910111213141516171819202122232425262728293031323..
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.A를 3만큼 밀면 D가 되고 z를 1만큼 밀면 a가 됩니다. 공백은 수정하지 않습니다.보낼 문자열 s와 얼마나 밀지 알려주는 n을 입력받아 암호문을 만드는 caesar 함수를 완성해 보세요.“a B z”,4를 입력받았다면 “e F d”를 리턴합니다. 문자들이 공백으로 구분되어있고 출력도 공백을 유지하여 출력하기 때문에 배열에 한꺼번에 넣어서 알파벳만 시프트 해주는 식으로 했다. 그 때문에 continue를 넣는 등 다소 부자연스러운 코드가 나오긴 했는데 일단 풀었으니... 주요 로직은 대, 소문자를 구분하여 시프트값이 z나 Z를 넘으면 다시 a, A로 돌아올 수 있도록 26을 빼주는 것이다. 그리고..