[백준] 2822번 : 점수 계산 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/2822📌 문제 개요8개의 점수가 주어질 때,가장 높은 점수 5개의 합과 해당 점수들의 문제 번호를 출력하는 문제단, 문제 번호는 오름차순으로 출력해야 한다.📌 접근 방법점수만 정렬하면 문제 번호를 잃어버리기 때문에 (점수, 번호) 형태로 함께 저장점수 기준으로 내림차순 정렬 후 상위 5개를 선택한다.선택된 문제 번호는 따로 배열에 저장 후 오름차순 정렬하여 출력한다.📌 핵심 아이디어정렬 기준이 2개 존재한다.1. 점수 기준 → 내림차순2. 번호 기준 → 오름차순따라서 한 번에 처리하지 않고선택 → 재정렬 구조로 해결📌 전체 코드package no_2822;import java.io.BufferedReader;import ja..
[백준] 10867번 : 중복 빼고 정렬하기 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/10867📌 문제 개요N개의 정수가 주어졌을 때,중복된 값을 제거한 후 오름차순으로 정렬하여 출력하는 문제📌 접근 방법입력값을 문자열로 받은 후 split()으로 분리Stream을 활용하여 데이터 처리distinct()로 중복 제거sorted()로 정렬 수행최종 결과를 배열로 변환하여 출력📌 핵심 아이디어Stream을 활용하면 중복 제거 + 정렬을 한 번에 처리 가능distinct() → 내부적으로 Set 구조 활용sorted() → 자동 오름차순 정렬코드가 간결하고 가독성이 뛰어남📌 전체 코드package no_10867;import java.io.*;import java.util.*;import java.util.strea..
[백준] 2161번 : 카드1 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/2161📌 문제 개요1부터 N까지의 카드가 순서대로 놓여 있다.다음 과정을 반복한다.맨 위 카드를 버린다.그 다음 카드를 맨 아래로 옮긴다.이 과정을 반복하면서 버린 카드의 순서를 출력하는 문제📌 접근 방법이 문제는 카드의 순서를 유지하면서 앞에서 꺼내고 뒤에 넣는 작업이 반복된다.따라서 Queue (큐) 자료구조를 사용하는 것이 가장 적합하다.poll() → 카드 제거 (버리기)add() → 카드 뒤로 이동📌 핵심 아이디어큐에 1부터 N까지 넣는다.큐의 크기가 1보다 클 때까지 반복한다.맨 앞 카드 버리기다음 카드 뒤로 보내기마지막 남은 카드 출력즉, 문제를 그대로 구현하는 시뮬레이션 문제📌 전체 코드package no_21..
[백준] 2740번 : 행렬 곱셈 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/2740📌 문제 개요두 개의 행렬 A(N×M), B(M×K)가 주어질 때,행렬의 곱 A×B를 구하는 문제이다.📌 접근 방법행렬 곱셈의 정의를 그대로 구현하면 된다.결과 행렬 크기 → N x K각 원소는 다음과 같이 계산 A의 행 × B의 열📌 핵심 아이디어행렬 곱셈 공식:C[i][j] = A[i][0]×B[0][j] + A[i][1]×B[1][j] + ...A의 i번째 행B의 j번째 열을 기준으로 같은 위치끼리 곱해서 누적한다.📌 전체 코드package no_2740;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;..
[백준] 24313번 : 알고리즘 수업 - 점근적 표기 1 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 개요https://www.acmicpc.net/problem/24313📌 문제 개요함수 f(n) = a1\*n + a0 이 주어졌을 때, f(n) ≤ c\*n 을 만족하여 O(n) 인지 판단하는 문제이다. 조건 : n ≥ n0 이 조건을 만족하는 모든 n에 대해 성립해야 한다.📌 접근 방법Big-O 정의를 그대로 코드로 구현하면 된다. 조건 : f(n) ≤ c\*n 여기서 f(n) = a1\*n + a0 이므로 a1\*n + a0 ≤ c\*n 이 된다. 그리고 문제에서 n ≥ n0 이므로 n = n0일 때 성립하는지만 확인하면 된다.📌 핵심 아이디어a1\*n + a0 ≤ c\*n a0 ≤ (c - a1)\*n 1️⃣ a1 ≤ c2️⃣ a1*n0 + a0 ≤ c*n0 이 두 조건을 만족..
[백준] 2846번 : 오르막길 (JAVA)
·
코테(Solved.ac + Programmers)
📌 문제 링크문제 링크 : https://www.acmicpc.net/problem/2846📌 문제 개요길의 높이가 순서대로 주어질 때, 연속해서 높이가 증가하는 구간(오르막길) 중에서 가장 큰 높이 차이를 구하는 문제이다.조건은 다음과 같다.높이가 계속 증가하면 오르막길높이가 같거나 감소하면 오르막 종료오르막길의 높이 차이는(오르막 끝 높이 - 오르막 시작 높이)여러 개의 오르막길이 존재할 수 있으며 가장 큰 높이 차이를 출력하면 된다.📌 접근 방법이 문제는 연속된 증가 구간을 찾는 문제배열을 순회하면서현재 오르막 시작 높이 start 를 저장다음 높이가 증가하면 오르막 유지감소하거나 같아지면 오르막 종료이때 매번 현재 높이 - 시작 높이 를 계산하여 최대값을 갱신하면 된다.시간복잡도는 배열을 한..
[백준] 1417번 : 국회의원 선거 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/1417📌 문제 개요다솜이는 국회의원 선거에 출마했다.다솜이는 다른 후보의 표를 매수하여 자신의 표로 만들 수 있다.매수를 한 번 하면 이 된다.다른 후보 표 -1다솜 표 +1다솜이가 단독 1등이 되기 위해 필요한 최소 매수 횟수를 구하는 문제📌 접근 방법이 문제의 핵심은 현재 가장 표가 많은 후보를 계속 찾아서 표를 빼앗는 것 이다.즉 매 반복마다 해야 하는 작업은 다음과 같다.가장 표가 많은 후보 찾기그 후보의 표를 1 감소다솜의 표를 1 증가이 과정을 다솜이 단독 1등이 될 때까지 반복한다.가장 표가 많은 후보를 계속 찾아야 하므로PriorityQueue(최대 힙) 을 사용하면 효율적으로 해결할 수 있다.📌 핵심 아이디어P..
[백준] 2167번 : 2차원 배열의 합 (JAVA)
·
코테(Solved.ac + Programmers)
📌 문제 링크https://www.acmicpc.net/problem/2167📌 문제 개요N × M 크기의 2차원 배열이 주어진다.이후 K개의 질의가 주어지며 각 질의는 다음과 같다. (i, j) ~ (x, y) 해당 범위에 포함되는 모든 배열 값의 합을 구하는 문제📌 접근 방법매번 범위를 직접 탐색하면 시간 복잡도가 커질 수 있다.그래서 행 기준 누적합(Prefix Sum)을 이용 각 행에서 왼쪽부터 누적합을 저장하면 특정 구간 합을 **O(1)**에 계산할 수 있다. 예를 들어 한 행에서1 2 4// 누적합 : 1 3 7 이때 구간 (2 ~ 3)의 합은 prefix\[3\] - prefix\[1\] 로 계산할 수 있다.📌 핵심 아이디어행 누적합 공식 : prefix\[i\]\[j\] = pre..
[백준] 2018번 : 수들의 합 5 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/2018📌 문제 개요자연수 N이 주어졌을 때, 연속된 자연수의 합으로 N을 표현할 수 있는 경우의 수를 구하는 문제예를 들어 N = 15일 경우1 + 2 + 3 + 4 + 5 4 + 5 + 6 7 + 8 15 총 4가지 경우가 존재한다.📌 접근 방법연속된 자연수의 합 문제이므로 투 포인터(Two Pointer) 방식으로 해결두 개의 포인터를 사용한다.start : 연속 구간의 시작 값end : 연속 구간의 끝 값sum : 현재 구간의 합초기 상태start = 1 end = 1 sum = 1 이후 sum과 N을 비교하면서 포인터를 이동시켜 모든 연속 구간을 탐색📌 핵심 아이디어현재 구간 [start ~ end] 의 합을 ..
[백준] 14916번 : 거스름돈 (JAVA)
·
코테(Solved.ac + Programmers)
🔗 문제 링크https://www.acmicpc.net/problem/14916📌 문제 개요2원과 5원 동전을 사용하여 n원을 만들 때동전의 최소 개수를 구하는 문제이다.만약 정확히 만들 수 없다면 -1을 출력📌 접근 방법동전 개수를 최소로 하기 위해 5원을 먼저 최대한 사용남은 금액이 2원으로 나누어 떨어지는지 확인나누어 떨어지지 않으면 5원을 하나 줄이고 다시 확인5원 개수가 0보다 작아지면 만들 수 없는 경우📌 핵심 아이디어5원을 최대한 사용하는 것이 동전 개수 최소에 유리하다.단, 남은 금액이 홀수라면 2원으로 만들 수 없다.따라서 5원 개수를 줄여가며 가능한 경우를 탐색이 방식은 그리디(Greedy) 전략📌 전체 코드package no_14916;import java.io.Buffere..