본문 바로가기

Problem Solving30

[Java] 프로그래머스 - 소수 찾기 숫자 조각으로 만들 수 있는 모든 수를 완전탐색으로 생성한 뒤, 중복을 제거하고 소수 개수를 구하는 문제 1. 문제 유형완전탐색, 백트래킹(DFS), 구현 2. 내가 놓친 포인트처음 떠올린 접근 : 문자 하나씩 조합해서 숫자를 만들고, set에 넣어서 중복을 제거한 뒤에 그 숫자가 소수인지 검사하면 될 것 같았다. 오답 원인: 풀이 아이디어는 맞았는데 코드로 구현을 못했다. 3. 핵심 로직 & 해결 방법핵심 조건: 주어진 숫자 조각들로 만들 수 있는 모든 길이의 숫자를 만들어야 하며 같은 숫자는 한 번만 세야 한다. 풀이 아이디어:visited[]를 사용해 현재 경로에서 이미 사용한 숫자 조각을 체크한다.dfs를 돌면서 숫자를 한 자리씩 이어 붙여 current를 만든다.current가 비어있지 않다면 .. 2026. 4. 17.
[Java] 프로그래머스 - 카펫 전체 칸 수의 약수쌍을 구한 뒤, 테두리를 제외한 내부 넓이가 yellow가 되는 가로·세로를 찾는 문제 1. 문제 유형완전탐색, 수학, 구현 2. 내가 놓친 포인트처음 떠올린 접근 : 갈색 칸 수를 직접 세면서 가로와 세로 규칙을 찾으려고 했다. 오답 원인: 전체 넓이와 내부 노란색 넓이의 관계를 식으로 바꿔서 봐야 했다.처음에는 brown 개수 변화만 보고 규칙을 찾으려 해서 접근이 길어졌다. 3. 핵심 로직 & 해결 방법핵심 조건: 전체 넓이의 약수쌍 중에서 테두리 1줄을 뺐을 때 내부 넓이가 yellow가 되는 가로·세로를 찾아야 한다. 풀이 아이디어:전체 칸 수 all = brown + yellow 를 구한다.전체 칸 수의 약수쌍을 구한다가로가 세로보다 같거나 클때 (가로 - 2) * (세로 .. 2026. 4. 14.
[Java] 프로그래머스 - 최소직사각형 명함을 회전할 수 있을 때, 모든 명함을 담을 수 있는 가장 작은 지갑의 넓이를 구하는 문제. 1. 문제 유형완전탐색, 구현 2. 내가 놓친 포인트처음 떠올린 접근 : 완전탐색이라고 해서 가로와 세로를 따로 기준 잡고, 어떤 명함은 돌리고 어떤 명함은 안 돌리는 식으로 경우를 많이 나눠서 생각했다. 오답 원인: 이 문제는 모든 경우의 수를 직접 조합할 필요가 없었다.각 명함마다 긴 변을 가로, 짧은 변을 세로로 통일해서 보면 전체 지갑 크기를 바로 구할 수 있는데, 처음에는 그 규칙을 못 봤다. 3. 핵심 로직 & 해결 방법핵심 조건: 명함은 회전할 수 있다. 풀이 아이디어:각 명함에서 두 변 중 큰 값을 가로, 작은 값을 세로로 맞춘다.그렇게 맞춘 뒤 가로들 중 최댓값과 세로들 중 최댓값을 구한다.두.. 2026. 4. 13.
[Java] 프로그래머스 - H-index 현재 논문이 가진 인용 횟수와 현재 위치부터 끝까지 남은 논문 수를 비교해서 H-Index를 구하는 문제. 1. 문제 유형정렬, 배열, 구현 2. 내가 놓친 포인트처음 떠올린 접근 : 주어진 배열을 정렬한 뒤 중간값 비슷한 값을 기준으로 답을 찾으려고 했다. 오답 원인: 중요한 것은 "논문 h편이 각각 h번 이상 인용되었는가"이 배열의 중앙값이 아니다.인용 횟수 자체가 아니라, 조건을 만족하는 논문 수를 함께 봐야 한다. 3. 핵심 로직 & 해결 방법핵심 조건: 논문이 총 h편 이상 있고, 그 h편의 인용 횟수가 모두 h 이상이어야 한다. 풀이 아이디어:인용 횟수 배열을 오름차순 정렬한다.앞에서부터 탐색하면서 현재 논문의 인용 횟수를 확인한다.전체 논문 수 - 현재 인덱스 = 현재 논문을 포함한 남은 논.. 2026. 4. 12.
[Java] 프로그래머스 - 가장 큰 수 숫자들을 이어 붙였을 때 가장 큰 수가 되도록 정렬 기준을 직접 설계해야 하는 문제 1. 문제 유형정렬, 문자열, 구현 2. 내가 놓친 포인트처음 떠올린 접근 : 배열의 모든 순서를 직접 만들어서 가장 큰 값을 찾으려고 했다. 오답 원인: 이 문제는 순열로 모든 경우를 확인하는 문제가 아니다.원소 개수가 최대 100,000개이기 때문에 모든 경우의 수를 만드는 방식은 불가능하다. 3. 핵심 로직 & 해결 방법핵심 조건: 숫자 자체의 대소 비교로는 정답을 구할 수 없다. 예를 들면 30은 3보다 크지만, 이어 붙여 보면 330과 303이 되어 3이 앞에 와야 더 큰 수가 된다. 풀이 아이디어:int[]를 String[]로 변환한다.두 문자열 a, b를 비교할 때 (b + a)와 (a + b)를 비교하는 .. 2026. 4. 11.
[Java] 프로그래머스 - K번째 수 주어진 구간을 잘라 정렬한 뒤, 그 안에서 K번째 수를 구하는 문제 1. 문제 유형배열, 정렬, 구현 2. 내가 놓친 포인트처음 떠올린 접근 : 각 명령어마다 배열의 i번째부터 j번째까지 잘라서 새로운 배열을 만들고, 정렬한 뒤 k번째 값을 answer 배열에 넣는 방식으로 접근했다. 오답 원인: Arrays.copyOfRange()의 끝 인덱스가 포함이 아니라 제외라는 점을 놓쳤다.그래서 commands[i][1] - 1을 넣어 마지막 값이 잘렸고, [4, 4, 1] 같은 경우에는 빈 배열이 만들어져 인덱스 에러가 발생했다. 3. 핵심 로직 & 해결 방법핵심 조건: 문제의 구간은 i번째부터 j번째까지처럼 끝 값이 포함되는 범위로 주어진다.하지만 Arrays.copyOfRange(arr, from, t.. 2026. 4. 10.