https://school.programmers.co.kr/learn/courses/30/lessons/87694 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr bfs를 사용하는 문제이다. 핵심 문제에서 주어진 사각형들에 대해 겉 테두리만 돌아서 아이템 위치에 가장 빠르게 도착하는 횟수를 구해야 한다. 중요포인트는 map을 2배로 늘리는 것이다. 이유는 맵을 탐색할 때 선이 아닌 좌표 기준으로 하기 때문에 바로 연결되어 있는지 판단하기 쉬운 방법이 2배로 늘리는 것이기 때문이다. 또한 내부 사각형과 테두리값을 구분해야 문제를 풀기 쉽다. 정답 코드 imp..
https://school.programmers.co.kr/learn/courses/30/lessons/150368 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 핵심 우리가 각각의 이모티콘을 10,20,30,40 퍼로 할인시킬 수 있다. 이때 구독자수를 최대로 하고, 이후에 가장 많은 돈을 벌게 하자. 이모티콘은 최대 7개이다. 즉 4^7가지의 경우의 수가 생기기 때문에 완전탐색을 사용하였다. 정답 코드 class Solution { static int[] discount = {10,20,30,40}; static int maxOfSubscribe; s..
https://www.acmicpc.net/problem/15559 15559번: 내 선물을 받아줘 첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000, 1 < N×M ≤ 1,000,000) 둘째 줄부터 N개의 줄에는 구사과가 있는 곳의 지도가 주어진다. 지도에 쓰여 있는대로 이동했을 www.acmicpc.net dfs 문제이다. 핵심 아래 알파벳에 따라 이동하는 길이 정해져 있고, 맵의 크기를 넘어서지 않는다. 즉 무조건 사이클이 생기게 된다. 이때 생기는 사이클의 수를 구하면 된다. 사이클을 구분하기 위해 depth를 증가시키면 탐색한다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; imp..
https://www.acmicpc.net/problem/17090 17090번: 미로 탈출하기 크기가 N×M인 미로가 있고, 미로는 크기가 1×1인 칸으로 나누어져 있다. 미로의 각 칸에는 문자가 하나 적혀있는데, 적혀있는 문자에 따라서 다른 칸으로 이동할 수 있다. 어떤 칸(r, c)에 적힌 문 www.acmicpc.net dfs와 dp를 활용한 문제이다. 핵심 어떠한 발판을 밟는 순간 이후의 동작은 동일해진다. 즉 이후에 탈출을 한다면 그 발판을 밟기 전에도 탈출을 한다는 의미이다. 이러한 사실을 이용해 dp를 적용할 수 있다. 또한 방문했던 곳을 다시 방문한다면 이것은 탈출을 할 수 없다는 의미이다. 이를 활용하여 풀어보자. 정답 코드 import java.util.Scanner; public c..
https://www.acmicpc.net/problem/1374 1374번: 강의실 첫째 줄에 강의의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 줄마다 세 개의 정수가 주어지는데, 순서대로 강의 번호, 강의 시작 시간, 강의 종료 시간을 의미한다. 강의 www.acmicpc.net 우선순위 큐를 활용해야 한다. 핵심 시작 시간이 빠른 순으로 정렬 후에 우선큐에서 현재 진행 중인 강의 중 종료 시간이 가장 빠른 강의를 비교한다. 진행 중인 강의의 end값이 다음 강의 start보다 크면 강의실 개수를 1 늘리고, 큐에 다음 강의를 넣는다. 반대의 경우 강의실 1개를 제거한다. 코드를 통해 알아보자. 정답 코드 import java.io.BufferedReader..
https://www.acmicpc.net/problem/1342 1342번: 행운의 문자열 민식이와 준영이는 자기 방에서 문자열을 공부하고 있다. 민식이가 말하길 인접해 있는 모든 문자가 같지 않은 문자열을 행운의 문자열이라고 한다고 한다. 준영이는 문자열 S를 분석하기 시작 www.acmicpc.net DFS를 사용하여 풀 수 있다. 핵심 사용할 알파벳이 있느냐, 이전 알파벳이 현재 알파벳과 같으냐 이것을 정의하고 풀 수 있다. 이러한 방법을 사용하면 같은 알파벳이지만, 배열위치가 다른 것도 1번만 확인하게 된다. ex) aba' == a'ba 정답 코드 import java.util.Scanner; public class Main{ static int[] alphabet = new int[27]; ..
https://www.acmicpc.net/problem/1034 1034번: 램프 첫째 줄에 N과 M이 주어진다. N은 행의 개수이고, M은 열의 개수이다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 램프의 상태가 주어진다. 1이 켜져있는 상태이고, 0이 꺼져 www.acmicpc.net 핵심 처음에 이 문제를 완전탐색을 해야 하는 줄 알았다. 하지만 시간복잡도에서 터지게 된다. 이 문제는 실제 스위치를 켜고 끄는 것이 아닌 행의 패턴을 비교하는 작업이 필요하다. 어떠한 패턴과 같은 행이 있다면 스위치를 눌렀을 때 모두 똑같이 변하게 된다. 이를 이용해서 풀어야 한다. 정답 코드 import java.io.BufferedReader; import java.io.IOExcep..
https://www.acmicpc.net/problem/13913 13913번: 숨바꼭질 4 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 www.acmicpc.net BFS를 사용하여 풀 수 있다. 핵심 시작점으로부터 +1,-1, *2 위치로 이동할 수 있다. 한번 방문한 곳은 이전에 방문했을 때가 최소이므로 재방문할 필요가 없다. 또한 이동경로를 구해야 하기 때문에 parent배열을 선언하여 이동 전 위치를 저장한다. 정답 코드 import java.util.LinkedList; import java.util.Queue; i..
https://www.acmicpc.net/problem/1753 1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net 다익스트라 문제이다. 핵심 이 문제는 가중치가 있는 다익스트라 문제이다. 가중치가 있기 때문에 클래스를 구현하는 것이 편리하다. 정답 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; imp..
https://www.acmicpc.net/problem/1655 1655번: 가운데를 말해요 첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1 www.acmicpc.net 우선순위 큐를 사용해야 하는 문제이다. 핵심 단순하게 풀려고 하면 시간복잡도에 의해 실패하게 된다. 따라서 우선순위 큐를 활용하여 풀어야 한다. 작은 값, 큰 값을 우선순위로 갖는 큐를 2개 만든다. 이후 minQ, maxQ라고 한다면, 아래와 같은 로직으로 작동하게 된다. 최대/최소 우선순위 큐의 크기가 같다면 최대 큐에 숫자를 입력해 준다. 같지 않다면 최소 큐에 숫자를 입력해..