프로그래머스 신호등 정전 JAVA 풀이 (시뮬레이션, 최소공배수)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요신호등마다 초록불 → 노란불 → 빨간불 순서로 반복되며, 각각의 지속 시간이 다르게 주어진다.모든 신호등은 1초부터 초록불 상태로 시작한다. 모든 신호등이 동시에 노란불이 되는 가장 빠른 시간을 구하고, 그런 시간이 없다면 -1을 반환하는 문제이다.📌 접근 방법각 신호등은 자신의 주기(G + Y + R) 를 반복한다.따라서 특정 시간 t에서 신호등의 상태는 현재 시간이 아니라 주기 내부의 몇 번째 초인지만 알면 판단할 수 있다. 모든 신호등의 상태는 각 주기의 최소공배수(LCM) 마다 동일하게 반복된다.따라서 1초부터 LCM까지 모든 ..
프로그래머스 창고 정리 JAVA 풀이
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요창고의 각 칸에 들어있는 물건 이름과 개수가 배열로 주어진다.같은 이름의 물건이 여러 칸에 나누어져 있을 수 있으므로, 같은 물건끼리 하나로 합쳐 개수를 누적해야 한다. 정리된 창고에서 개수가 가장 많은 물건의 이름을 반환하는 문제이다.📌 접근 방법중복된 물건을 하나로 합치기 위해 새로운 배열을 사용했다.clean_storage에는 중복이 제거된 물건 이름을 저장하고, clean_num에는 해당 물건의 누적 개수를 저장한다.기존 storage 배열을 순회하면서 현재 물건이 이미 clean_storage에 있는지 확인한다. 이미 있다면 ..
프로그래머스 숫자의 표현 JAVA 풀이 (투 포인터, 슬라이딩 윈도우)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요자연수 n이 주어질 때, 연속된 자연수들의 합으로 n을 표현할 수 있는 경우의 수를 구하는 문제이다.예를 들어 15는 다음과 같이 표현할 수 있다.1 + 2 + 3 + 4 + 5 = 154 + 5 + 6 = 157 + 8 = 1515 = 15따라서 정답은 4이다.📌 접근 방법연속된 자연수의 구간을 표현하기 위해 투 포인터를 사용한다.start와 end를 이용하여 현재 구간을 나타내고, 현재 구간의 합을 sum으로 관리한다.sum 이면 구간이 부족하므로 오른쪽을 확장한다.sum > n 이면 구간이 크므로 왼쪽을 줄인다.sum == n ..
프로그래머스 다음 큰 숫자 JAVA 풀이 (비트 연산, Integer.bitCount)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요자연수 n이 주어질 때 다음 조건을 만족하는 가장 작은 자연수를 구하는 문제이다.n보다 큰 수n과 2진수의 1의 개수가 같은 수조건을 만족하는 수 중 가장 작은 수예를 들어 78의 이진수는 다음과 같다.78 = 10011101의 개수는 4개이다.이후 숫자를 확인하면79 = 1001111 (5개)80 = 1010000 (2개)81 = 1010001 (3개)82 = 1010010 (3개)83 = 1010011 (4개)따라서 정답은 83이다.📌 접근 방법현재 숫자의 1의 개수를 먼저 구한다.int count = Integer.bitCount..
프로그래머스 피보나치 수 JAVA 풀이 (DP, 공간 최적화)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요피보나치 수열은 다음과 같은 규칙을 가진다. n번째 피보나치 수를 구한 뒤, 1234567로 나눈 나머지를 반환하는 문제이다.F(0) = 0F(1) = 1F(n) = F(n-1) + F(n-2)📌 접근 방법처음에는 DP 배열을 사용하여 모든 피보나치 값을 저장할 수 있다.arr[i] = arr[i - 1] + arr[i - 2];하지만 현재 값을 계산할 때 필요한 것은 직전 두 개의 값뿐이다.따라서 배열 대신 두 개의 변수만 사용하여 공간을 절약할 수 있다.또한 피보나치 수는 매우 빠르게 증가하므로 매 계산마다 1234567로 나눈 나..
프로그래머스 올바른 괄호 JAVA 풀이 (스택)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요괄호 문자열이 주어졌을 때 올바른 괄호인지 판별하는 문제이다.올바른 괄호란 열린 괄호 ( 가 나오면 반드시 대응되는 닫힌 괄호 ) 가 존재해야 하며, 순서 또한 올바르게 짝지어져 있어야 한다.예를 들어()() → 올바른 괄호(())() → 올바른 괄호)()( → 올바르지 않은 괄호(()( → 올바르지 않은 괄호문자열이 올바른 괄호이면 true, 아니면 false를 반환한다.📌 접근 방법괄호의 짝을 확인해야 하므로 스택(Stack)을 사용한다.문자를 하나씩 확인하면서( 이면 스택에 저장한다.) 이면 가장 최근에 저장된 ( 와 짝을 맞춘다..
프로그래머스 최솟값 만들기 JAVA 풀이 (그리디, 정렬)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요길이가 같은 두 배열 A, B가 주어진다.각 배열에서 숫자를 하나씩 선택하여 곱한 뒤 누적 합을 구한다. 모든 원소를 한 번씩만 사용해야 하며, 최종 누적 합이 최소가 되도록 만들어야 한다.📌 접근 방법처음에는 같은 인덱스의 값끼리 곱하면 된다고 생각할 수 있다.하지만 이렇게 하면 최솟값이 보장되지 않는다. 예를 들어, 같은 인덱스끼리 곱하면A = [1, 2]B = [3, 4]1 * 3 + 2 * 4 = 11 반면 아래와 같이 작업시 더 작다.따라서 작은 수와 큰 수를 매칭하는 방식이 필요하다.1 * 4 + 2 * 3 = 10📌 핵심..
프로그래머스 JadenCase 문자열 만들기 JAVA 풀이 (문자열, 구현)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요문자열 s가 주어졌을 때, 각 단어를 JadenCase 형태로 변환하는 문제이다.JadenCase는 각 단어의 첫 문자가 대문자이고, 나머지 문자는 소문자인 문자열을 의미한다. 단, 첫 문자가 숫자인 경우 숫자는 그대로 두고, 그 뒤에 나오는 알파벳들은 소문자로 변환해야 한다.또한 문자열에는 공백이 연속해서 나올 수 있으므로, 기존 공백 형태를 그대로 유지해야 한다.📌 접근 방법문자열을 공백 기준으로 나누는 대신, 문자 하나씩 순회하면서 처리한다.현재 문자가 단어의 첫 번째 문자인지 판단하기 위해 isFirst 변수를 사용한다. 공백을..
프로그래머스 최댓값과 최솟값 JAVA 풀이 (문자열, 구현)
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요공백으로 구분된 정수들이 하나의 문자열로 주어진다.문자열에 포함된 숫자들 중 최솟값과 최댓값을 찾아 "최솟값 최댓값" 형태의 문자열로 반환하는 문제이다. 예시"1 2 3 4""1 4"📌 접근 방법문자열을 공백 기준으로 나누면 각각의 숫자를 문자열 배열로 얻을 수 있다.String[] arr = s.split(" ");이후 반복문을 돌면서 정수로 변환하고 최솟값과 최댓값을 갱신한다.int num = Integer.parseInt(arr[i]);모든 숫자를 확인한 뒤 "min max" 형태로 문자열을 만들어 반환한다.📌 핵심 아이디어1...
프로그래머스 이웃한 칸 JAVA 풀이
·
코테(Solved.ac + Programmers)
🔗 문제 링크 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr📌 문제 개요2차원 문자열 배열 board가 주어진다.각 칸에는 색깔 이름이 문자열로 저장되어 있고, 특정 위치를 나타내는 h, w가 주어진다. 이때 board[h][w]와 위, 아래, 왼쪽, 오른쪽으로 인접한 칸들 중 같은 색깔을 가진 칸의 개수를 구하는 문제이다.📌 접근 방법현재 위치의 색깔을 기준으로 상하좌우 네 방향을 확인한다.2차원 배열에서 상하좌우 이동은 방향 배열을 사용하면 깔끔하게 처리할 수 있다.int[] dh = {0, 1, -1, 0};int[] dw = {1, 0, 0, -1};각 방향으로 이동한 좌표가 보드 범위 안에 있는지..