프로그래머스 가장 가까운 같은 글자 JAVA 풀이 (해시맵, 문자열)
·
코테(Solved.ac + Programmers)
📌 문제 개요문자열의 각 위치마다 자신보다 앞에 등장했던 같은 문자 중 가장 가까운 위치와의 거리를 구하는 문제처음 등장한 문자는 -1이전에 등장한 문자는현재 인덱스 - 이전 인덱스banana[-1, -1, -1, 2, 2, 2]📌 접근 방법문자를 순서대로 탐색하면서각 문자의 마지막 등장 위치를 저장처음 등장한 문자 : -1이미 등장했던 문자 : 현재 위치 - 이전 위치 계산이후 현재 위치로 갱신📌 핵심 아이디어핵심은 가장 최근 위치만 저장하면 된다는 점예를 들어 "banana"에서 마지막 a를 처리할 때:a의 이전 위치 = 3현재 위치 = 5거리 = 2가장 가까운 문자만 필요하므로이전 모든 위치를 저장할 필요가 없다HashMap 형태로 관리하면 됩니다.📌 전체 코드import java.util...
프로그래머스 3진법 뒤집기 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/68935📌 문제 개요자연수 n을 3진법으로 변환한 뒤 숫자를 뒤집고,다시 10진수로 변환하는 문제이다. 단순 구현 문제처럼 보이지만,Integer.parseInt() 의 진법 처리 방식을 정확히 이해해야 한다.📌 접근 방법문제 해결 흐름은 다음과 같다.Integer.toString(n, 3) 으로 3진수 문자열 변환StringBuilder.reverse() 로 문자열 뒤집기Integer.parseInt(str, 3) 으로 다시 10진수 변환📌 핵심 아이디어1. 10진수 → 3진수 변환Integer.toString() 의 두 번째 인자에 진법을 넣으면해당 진수 문자열로 변환할 수 있..
프로그래머스 최소직사각형 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/86491📌 문제 개요여러 개의 명함이 주어질 때,모든 명함을 수납할 수 있는 가장 작은 지갑 크기를 구하는 문제명함은 회전 가능하므로, 가로와 세로를 자유롭게 변경할 수 있다.📌 접근 방법각 명함마다을 구분하여 방향을 통일했다.긴 변짧은 변이후 구하면 모든 명함을 포함할 수 있는 최소 지갑 크기가 된다.긴 변들 중 최대값짧은 변들 중 최대값📌 핵심 아이디어1. 명함 회전 가능[30, 70]// 회전 시[70, 30] 따라서 모든 명함의 긴 변을 한 방향으로 맞추는 것이 핵심이다.2. Math.max / Math.min 활용// 긴 변Math.max(card[0], card[1])..
프로그램머스 이상한 문자 만들기 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/12930📌 문제 개요문자열이 주어졌을 때각 단어의 짝수 인덱스 문자는 대문자,홀수 인덱스 문자는 소문자로 변환하는 문제 주의할 점은 문자열 전체 기준이 아니라공백을 기준으로 단어마다 인덱스를 다시 계산해야 한다.📌 접근 방법문자열을 한 글자씩 순회하면서 처리했다.공백이면공백 추가index를 0으로 초기화공백이 아니면짝수 인덱스 → 대문자홀수 인덱스 → 소문자문자열 수정이 많기 때문에 StringBuilder를 사용했다.📌 핵심 아이디어단어별 인덱스를 따로 관리해야 한다.try hello world012 01234 01234공백 이후에는 다시 0번 인덱스부터 시작if(s.charAt..
프로그래머스 삼총사 JAVA 풀이 (브루트포스, 조합, 시간복잡도)
·
코테(Solved.ac + Programmers)
서로 다른 3명을 선택하는 모든 경우를 탐색하는 브루트포스 문제📌 문제 개요학생들의 번호 배열이 주어질 때,서로 다른 학생 3명의 번호 합이 0이 되는 경우의 수를 구하는 문제📌 접근 방법배열 길이가 최대 13이므로, 모든 경우를 직접 탐색해도 충분밖에 나오지 않기 때문에 3중 반복문 브루트포스로 해결할 수 있습니다.13C3 = 286📌 핵심 아이디어1. 조합 생성첫 번째 학생 선택for(int i = 0; i 2. 중복 제거이미 선택한 학생은 다시 선택하지 않도록 처리.for(int j = i + 1; j 3. 세 수의 합 확인합이 0이면 count 증가if(number[i] + number[j] + number[k] == 0)📌 전체 코드package level1;public class No3..
프로그래머스 최대공약수와 최소공배수 JAVA 풀이 (유클리드호제법, 시간복잡도)
·
코테(Solved.ac + Programmers)
유클리드 호제법을 활용하여 최대공약수(GCD)와 최소공배수(LCM)를 구하는 문제입니다.Q두 수 n, m이 주어질 때:최대공약수최소공배수를 배열 형태로 반환하는 문제정답package level1;public class No33 { class Solution { public int[] solution(int n, int m) { int gcd = getGCD(n, m); return new int[]{ gcd, (n * m) / gcd }; } public static int getGCD(int n, int m){ if..
프로그래머스 크기가 작은 부분문자열 JAVA 풀이 (문자열, substring, 시간복잡도)
·
코테(Solved.ac + Programmers)
substring()을 이용하여 부분문자열을 잘라 비교하는 문제입니다.📌 Q문자열 t에서 p와 길이가 같은 부분문자열 중에서,해당 숫자가 p보다 작거나 같은 경우의 개수를 구하는 문제📌 정답코드package level1;public class No34 { public static void main(String[] args) { String T = "500220839878"; String P = "7"; int len = P.length(); int cnt = 0; for(int i = 0; i 📌 핵심 포인트substring 활용T.substring(i, i + len)현재 위치부터 len 길이만큼 문자열을 잘라낸다.T = "314..
프로그래머스 같은 숫자는 싫어 JAVA 풀이 (스택, 구현, 시간복잡도)
·
코테(Solved.ac + Programmers)
🔗 문제 링크프로그래머스 같은 숫자는 싫어📌 문제 개요배열에서 연속으로 등장하는 같은 숫자를 제거하는 문제이다.단순 중복 제거가 아니라 처럼 연속된 숫자만 제거해야 한다.[1,1,3,3,0,1,1]→ [1,3,0,1]📌 접근 방법현재 숫자와 직전에 저장된 숫자를 비교직전 숫자와 같다면 추가하지 않고, 다르면 Stack에 저장하는 방식으로 해결📌 핵심 아이디어핵심은 마지막으로 저장된 값만 비교하면 된다는 점stack.peek()Stack의 가장 위(마지막 값)를 조회할 수 있다.현재 숫자와 마지막 값이 다를 때만 push 하면 연속 중복 제거가 가능하다.📌 전체 코드package level1;import java.util.Stack;public class No32 { public static..
프로그래머스 행렬의 덧셈 JAVA 풀이 (2차원배열, 구현)
·
코테(Solved.ac + Programmers)
🔗 문제 링크프로그래머스 행렬의 덧셈📌 문제 개요크기가 같은 두 개의 2차원 배열이 주어진다.같은 위치의 값을 서로 더한 결과를 새로운 2차원 배열로 반환하는 문제이다.arr1 = [[1,2],[2,3]]arr2 = [[3,4],[5,6]]결과:[[4,6],[7,9]]📌 접근 방법2차원 배열은 다음 구조를 가진다.[행][열]따라서 이중 반복문을 사용해서 모든 요소를 순회했다.for (int i = 0; i 그리고 같은 위치의 값을 더해서 결과 배열에 저장했다.📌 핵심 아이디어1. 결과 배열 크기 생성결과 배열은 기존 배열과 동일한 크기를 가져야 한다.int[][] answer = new int[arr1.length][arr1[0].length];arr1.length → 행 개수arr1[0].len..
프로그래머스 문자열 다루기 기본 JAVA 풀이 (문자열, 구현)
·
코테(Solved.ac + Programmers)
🔗 문제 링크프로그래머스 문자열 다루기 기본📌 문제 개요문자열 s가 아래 조건을 만족하는지 확인하는 문제이다.길이가 4 또는 6숫자로만 구성조건을 만족하면 true, 아니면 false를 반환하면 된다.📌 접근 방법먼저 문자열 길이가 4 또는 6인지 검사했다.if (s.length() != 4 && s.length() != 6)이후 반복문으로 문자열을 순회하면서 숫자인지 확인했다.Character.isDigit(s.charAt(i))숫자가 아닌 문자가 하나라도 나오면 바로 false를 반환하도록 구현했다.📌 핵심 아이디어1. Character.isDigit()Character.isDigit(ch)자바에서 문자가 숫자인지 판별하는 메서드이다.직접 '0' ~ '9' 범위를 비교하지 않아도 되기 때문에 ..