본문 바로가기

해시셋20

[프로그래머스] 67258번 - 보석 쇼핑 [Java] https://school.programmers.co.kr/learn/courses/30/lessons/67258 문제 설명 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 개발자 출신으로 세계 최고의 갑부가 된 어피치는 스트레스를 받을 때면 이를 풀기 위해 오프라인 매장에 쇼핑을 하러 가곤 합니다.어피치는 쇼핑을 할 때면 매장 진열대의 특정 범위의 물건들을 모두 싹쓸이 구매하는 습관이 있습니다.어느 날 스트레스를 풀기 위해 보석 매장에 쇼핑을 하러 간 어피치는 이전처럼 진열대의 특정 범위의 보석을 모두 구매하되 특별히 아래 목적을 달성하고 싶었습니다. 진열된 모든 종류의 보석을 적어도 1개 이상 포함하는 가장 짧은 구간을 찾아서 구매 예를 들어 아래 진열대는 4종류의 보석(RUBY,.. 2025. 3. 10.
[백준] 25370번 - 카드 숫자 곱의 경우의 수 [Java] https://www.acmicpc.net/problem/25370 1.  아이디어 중복 순열을 활용하면 간단하게 해결할 수 있다.2. 문제풀이 1부터 9까지의 카드를 중복해서 선택할 수 있고 7장을 선택했을 때 곱의 경우의 수를 구하는 문제로 선택을 중복 순열로 찾아나가며 값을 파라미터로 들고 다녔다. 이후 7장의 선택이 끝나면 Set에 넣는 과정을 반복했고 경우의 수는 Set의 크기를 구하면 된다.3. 코드 package day_01.BOJ_25370;import java.io.*;import java.util.*;public class Main { private static final Set set = new HashSet(); private static int N; public s.. 2025. 3. 3.
[소프티어] 6248번 - 출퇴근길 [Java] https://softeer.ai/practice/6248 1.  아이디어 시작점에서 방문할 수 있는 점들은 DFS 알고리즘으로 간단하게 구할 수 있다. 이때 다른 점들에서 도착점을 갈 수 있는지 여부는 역방향 간선을 활용해서 도착점에서 역방향 간선으로 DFS 알고리즘을 적용하면 간단하게 구할 수 있다.2. 문제풀이 동환이의 집에서 출근길에 포함되는 점들은 동환이의 집에서 DFS 알고리즘으로 방문 가능한 정점을 찾고 다시 방문 가능한 점들이 회사에 갈 수 있는지 찾으면 구할 수 있다. 하지만 처음 동환이가 찾은 방문 가능한 정점의 수가 늘어날 수록 DFS 알고리즘을 반복적으로 적용해야해서 시간초과가 발생하게 된다. 이를 해결하기 위해 동환이의 집에서 출근길에 포함되는 점들을 DFS 알고리즘으로 찾은 후.. 2025. 2. 10.
[백준] 11723번 - 집합 [Java] https://www.acmicpc.net/problem/11723 1.  아이디어 집합을 구현하는 문제로 Set 자료구조를 활용한 구현과 비트마스킹을 활용한 구현 두가지 방식을 활용했다.2. 문제풀이 switch 문으로 연산 종류에 맞게 연산을 수행하도록 구현했다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWrit.. 2025. 2. 2.
[백준] 15595번 - 정답 비율 계산하기 [Java] https://www.acmicpc.net/problem/15595 1.  아이디어 HashSet과 HashMap을 활용해서 해결할 수 있었다.2. 문제풀이 Set에는 문제를 맞은 사람의 id, Map에는 문제를 틀린 사람의 id를 key, 문제를 틀린 횟수를 value에 저장했다. 문제를 틀린 횟수는 문제를 맞은 후로는 세지 않아야 한다. 입력을 받아 저장한 후 Map을 순회하며 Set에 있는 id인 경우에만 횟수를 세주면 문제를 맞은 사람이 문제를 맞기 전까지 틀린 횟수의 총합을 간단하게 구할 수 있다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws I.. 2025. 1. 22.
[백준] 31859번 - SMUPC NAME [Java] https://www.acmicpc.net/problem/31859 1.  아이디어 StringBuilder의 append 메서드와 reverse 메서드를 활용해서 해결할 수 있다.2. 문제풀이 규칙1, 2은 Set 자료구조를 활용해서 해결하고 규칙 3, 4, 5는 StringBuilder의 메서드를 활용해서 해결하는 방식으로 구현했다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); .. 2025. 1. 16.
[백준] 10815번 - 숫자 카드 [Java] https://www.acmicpc.net/problem/10815 1.  아이디어 Set 자료구조로 간단하게 해결할 수 있다.2. 문제풀이 주어진 정수가 상근이가 가지고 있는 숫자 카드에 적혀있는지 여부만 판단하면 되므로 HashSet을 활용해 포함 여부만 판단하는 방식으로 구현했다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new B.. 2025. 1. 13.
[백준] 1920번 - 수 찾기 [Java] https://www.acmicpc.net/problem/1920 1.  아이디어 Set 자료구조로 간단하게 정수가 존재하는지 판단할 수 있다.2. 문제풀이 주어진 N개의 정수를 HashSet에 넣은 후 M개의 수가 이 안에 존재하는지 contains 메서드로 확인하는 방식으로 구현했다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new .. 2025. 1. 12.
[백준] 1269번 - 대칭 차집합 [Java] https://www.acmicpc.net/problem/1269 1.  아이디어 두 차집합의 크기의 합은 두 집합의 크기 - 2 * 교집합의 크기다.2. 문제풀이 Set의 retainAll 메서드로 교집합을 구할 수 있다. 두 집합 A, B를 HashSet으로 구현한 후 intersection이라는 교집합을 만들었다. 교집합은 생성자에 A를 넣은 후 retainAll(B)를 해주면 간단하게 구할 수 있다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedRead.. 2025. 1. 9.
[백준] 14425번 - 문자열 집합 [Java] https://www.acmicpc.net/problem/14425 1.  아이디어 Set 자료구조로 간단하게 해결할 수 있다.2. 문제풀이 HashSet에 N개의 문자열을 넣은 후 M개의 문자열이 HashSet에 포함되어 있는지 contains 메서드로 확인하는 방식으로 구현했다.3. 코드 import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new S.. 2025. 1. 9.
[백준] 18870번 - 좌표 압축 [Java] https://www.acmicpc.net/problem/18870 1.  아이디어 수직선 위에 주어진 좌표가 전체 좌표 중 중복을 제외하고 몇 번째로 큰 좌표인지 구하는 문제로 좌표에 대한 정렬을 수행 후 Map을 활용하는 방식과 이분 탐색을 활용하는 방식 두가지로 구현할 수 있었다.2. 문제풀이 1. HashMap주어진 좌표를 List로 받은 후 TreeSet에 복사해서 중복 제거 + 정렬을 수행했다. 이후 TreeSet을 순회하며 HashMap에 좌표와 순서를 저장해주었고 List를 순회하며 HashMap에서 순서를 조회하는 방식으로 구현했다. 2. 이분 탐색주어진 좌표를 배열로 받은 후 HashSet에 넣어 중복 제거를 수행했다. 이후 HashSet과 같은 크기의 배열에 넣고 정렬을 수행한 후 .. 2025. 1. 7.
[백준] 2295번 - 세 수의 합 [Java] https://www.acmicpc.net/problem/2295 1.  아이디어 x + y + z = k 를 x + y = k - z 로 생각하면 O(N^3) 보다 빠르게 해결할 수 있다.2. 문제풀이 N이 최대 1000이어서 3중 for문을 이용한 단순한 풀이로는 해결할 수 없다.아이디어처럼 두 수의 합들을 먼저 구한 후 두 수의 차가 두 수의 합에 포함될 경우 k를 구할 수 있다. 구현에서는 입력을 배열로 받아서 정렬한 후 두 수의 합은 HashSet에 저장했다. 이후 2중 for문을 역방향 순회하며 두 수의 차가 HashSet에 포함될 경우 z에 해당하는 값을 더하는 방식으로 구현했다. 배열을 정렬했어서 처음 찾는 값이 최대가 된다.3. 코드 import java.io.*;import java... 2025. 1. 6.