프로그래머스 문자열 내림차순으로 배치하기 JAVA 풀이 (문자열)
·
코테(Solved.ac + Programmers)
문제 요약문자열의 문자를 큰 문자부터 작은 문자 순으로 정렬하는 문제이다.대문자는 소문자보다 작은 것으로 처리된다.즉:소문자 > 대문자내림차순 정렬 수행접근 방법문자열은 직접 정렬할 수 없기 때문에:split("")으로 문자열 분리Arrays.sort() 사용Collections.reverseOrder()로 내림차순 정렬StringBuilder로 다시 문자열 합치기방식으로 해결했다.핵심 아이디어문자열 정렬에서 가장 중요한 부분은: Collections.reverseOrder() 이 메서드는 객체 타입만 가능하다는 점이다.따라서: char[] 대신 String[] 배열로 처리해야 한다.전체 코드package level1;import java.util.Arrays;import java.util.Collect..
프로그래머스 약수의 개수와 덧셈 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크프로그래머스 약수의 개수와 덧셈📌 문제 개요두 정수 left, right 사이의 숫자들을 순회하면서 최종 결과를 반환하는 문제약수 개수가 짝수 → 더하기약수 개수가 홀수 → 빼기처음에는 약수를 직접 구해서 개수를 세는 방식으로 접근했지만,문제의 핵심 규칙을 발견하면 훨씬 간단하게 해결할 수 있다.📌 접근 방법완전제곱수는 약수 개수가 홀수 보통 약수는 쌍으로 존재한다.예를 들어 12의 약수는 이렇게 짝으로 존재하므로 약수 개수는 짝수가 된다.1 × 122 × 63 × 4 하지만 완전제곱수인 16 처럼 루트 값이 자기 자신과 겹친다. 1 × 162 × 84 × 4혼자 남기 때문에 약수 개수가 홀수가 된다.4📌 핵심 아이디어완전제곱수 판별은 다음처럼 가능하다.int sqrt = (int)M..
[CRM 개발일지 #5] 상담 신청 기능 구조 설계
·
SpringBoot
🚀 TODAY WORK백엔드상담 신청 기능 구조 설계ActivityLog 엔티티 생성ActivityLog Repository 생성ActivityLog Service 생성고객 중복 조회 기능 설계연락처 + 생년월일 기준 고객 조회 메서드 추가상담 신청 Request DTO 설계상담 신청 API 구조 설계상담 신청 Controller 패키지 구조 검토🚨 TODAY ISSUE고객 중복 생성 방지 기준 정의상담 신청은 비회원도 가능하기 때문에 동일 고객이 여러 번 신청할 수 있다.고객 중복 생성 방지를 위해 어떤 값을 기준으로 고객을 식별할지 검토했다. 기존 고려안문제점 : 동명이인 존재 가능이름 + 연락처최종 결정 해당 기준으로 기존 고객 여부를 판단하도록 설계했다.연락처 + 생년월일ActivityLog ..
프로그래머스 제일 작은 수 제거하기 JAVA 풀이 (알고리즘, 시간복잡도)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/12935📌 문제 개요정수를 저장한 배열에서 가장 작은 수를 제거한 배열을 반환하는 문제이다.단, 배열의 길이가 1이라면 제거 후 빈 배열이 되므로 [-1]을 반환해야 한다.📌 접근 방법이 문제는 크게 두 단계로 해결할 수 있다.배열의 최솟값 찾기최솟값을 제외한 새로운 배열 생성Java Stream API를 사용하면 코드가 매우 간결해진다.min() : 배열 최솟값 탐색filter() : 특정 값 제외toArray() : int 배열 변환📌 핵심 아이디어최솟값을 먼저 구한 뒤,int min = Arrays.stream(arr) .min() .getAsInt(..
프로그래머스 나누어 떨어지는 숫자 배열 JAVA 풀이 (정렬, Stream)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/12910📌 문제 개요정수 배열 arr와 정수 divisor가 주어진다.배열 원소 중 divisor로 나누어 떨어지는 값만 골라오름차순으로 정렬한 배열을 반환해야 한다. 만약 나누어 떨어지는 값이 하나도 없다면 [-1] 을 반환한다.📌 접근 방법이 문제는 배열을 순회하며 조건에 맞는 값만 추출하면 된다.이번 풀이에서는 Java Stream API를 사용하여:filter() → 조건 필터링sorted() → 오름차순 정렬toArray() → int[] 변환과정을 한 번에 처리또한 결과 배열이 비어있는 경우 {-1}을 반환하도록 처리했다.📌핵심 아이디어1. divisor로 나누어 떨어지..
프로그래머스 단어 퍼즐 JAVA 풀이 (DP, 시간복잡도)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/12983📌 문제 개요주어진 단어 조각들을 이용해 문자열을 완성하는 문제이다.각 단어는 무한히 사용할 수 있으며, 최소 개수로 문자열을 구성해야 한다. 📌 접근 방법문자열을 앞에서부터 구성하는 DP 문제dp[i]를 i까지 문자열을 만들 때 필요한 최소 단어 개수로 정의단어 최대 길이가 5이므로 뒤에서 최대 5글자만 확인📌 핵심 아이디어문자열 최소 분할 문제 = DP점화식 : dp[i] = min(dp[i - len] + 1) 조건 : t.substring(i-len, i) 가 strs 에 포함되어야 함Set을 사용하여 탐색 최적화📌 전체 코드import java.util.*;cla..
프로그래머스 스타 수열 JAVA 풀이 (그리디, 시간복잡도)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/70130📌 문제 개요배열의 부분수열 중에서 특정 조건을 만족하는 “스타 수열”의 최대 길이를 구하는 문제이다.스타 수열은 각 쌍마다 공통으로 등장하는 원소가 존재해야 하며, 각 쌍의 원소는 서로 달라야 한다. 📌 접근 방법스타 수열은 반드시 하나의 공통 원소를 가진다.따라서 모든 경우를 탐색하는 것이 아니라 특정 값 v를 기준으로 수열을 구성배열을 순회하며v가 포함된 쌍만 선택한 번 사용한 원소는 다시 사용하지 않도록 skip 처리📌 핵심 아이디어스타 수열 = "공통 원소 기반 수열"각 값 v를 기준으로 최대 쌍을 만들면 된다핵심 조건: (a[i] == v || a[i+1] ==..
백준 9461번 : 파도반 수열 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/9461📌 문제 개요파도반 수열은 특정 규칙을 따르는 수열이다.주어진 N에 대해 N번째 값을 구해야 한다. 여러 개의 테스트 케이스가 주어지며, 각각 결과를 출력한다.📌 접근 방법DP 배열을 이용해 수열을 미리 계산최대 N이 100이므로 한 번만 계산하면 충분이후 입력받은 값에 대해 바로 출력📌 핵심 아이디어점화식 : P[n] = P[n-2] + P[n-3]초기값 : P[1] = 1, P[2] = 1, P[3] = 1값이 커지므로 long 사용📌 전체 코드package no_9461;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStre..
백준 [2851] 슈퍼 마리오 JAVA 풀이 (브루트포스, 누적합)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/2851📌 문제 개요10개의 버섯 점수가 순서대로 주어진다.마리오는 버섯을 순서대로 먹으며 점수를 얻고, 목표 점수인 100에 가장 가까운 점수를 만들어야 한다.만약 100과의 차이가 같은 경우에는 더 큰 점수를 출력 📌 접근 방법버섯은 주어진 순서대로만 먹을 수 있으므로, 앞에서부터 점수를 계속 더한 누적합을 확인하면 된다.각 단계마다 현재 누적합이 기존 정답보다 100에 더 가까운지 비교한다.📌 핵심 아이디어기준 점수는 100이다.현재 누적합과 정답 후보의 차이를 비교한다.Math.abs(100 - sum) 차이가 더 작으면 정답을 갱신하고, 차이가 같다면 더 큰 값을 선택 📌 전체 코드import java.io.Buffe..
백준 4008 특공대 JAVA 풀이 (DP, CHT, 누적합, 시간복잡도)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 https://www.acmicpc.net/problem/4008📌 문제 개요병사들을 연속된 구간으로 나누고,각 구간의 합을 x라고 할 때 ax² + bx + c의 점수를 계산하여전체 점수의 최댓값을 구하는 문제 단순하게 모든 구간을 고려하면 시간복잡도가 O(N²)이 되어N = 1,000,000에서 절대 풀 수 없다.📌 접근 방법이 문제의 핵심은 DP + 식 변형 + CHT 최적화입니다.먼저 누적합을 정의합니다.S[i] = x1 + x2 + ... + xi그러면 구간 합은 다음처럼 계산됩니다.구간 합 = S[i] - S[j]이제 DP를 정의합니다.dp[i] = 1 ~ i까지 최대 점수점화식: dp[i] = max(dp[j] + f(S[i] - S[j])) 여기서 그대로 계산하면 O(N..