본문 바로가기
728x90

C++/백준 Etc14

행렬 회전변환 N x N 행렬이 주어질 때, 90도 180도 270도 회전. 행렬을 그려보고, 받을 행렬의 위치를 기준으로, 회전으로 넣을 행렬의 인덱스 변화를 살펴보면서 세팅하면 편하다. 2024. 9. 21.
[c++] 1181, 우선순위 큐 + operator 정렬 문제 : https://www.acmicpc.net/problem/1181 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net 문제 알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오. 길이가 짧은 것부터 길이가 같으면 사전 순으로 단, 중복된 단어는 하나만 남기고 제거해야 한다. 입력 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는.. 2023. 10. 25.
[c++] BFS example from 바킹독 BFS (Breadth First Search) : 다차원 배열에서 각 칸을 방문할 때 너비를 우선으로 방문하는 알고리즘 예를 들어, 위와 같은 배열에서 파란색 지역을 탐색하는 알고리즘이다. 시작은 좌측 상단(0,0)에서부터 상,하,좌,우의 인접한 배열의 값들을 방문하여 파란색 좌표를 search한다. 이때, 그림에서 오른쪽과 같이 queue의 자료구조를 이용해, 현재 탐색하는 배열의 (행,열)의 번호를 저장한다. 새로운 파란색 점이 나올시 쌓이며(push), 이전에 탐색한 파란색 점의 정보는 제거한다(pop). queue가 비워질때까지 계속한다. queue는 #include에 있는 pair라는 쌍 자료형을 받을 수 있는 객체를 사용해서 queue에 쌓아준다. 관련 내용은 아래 링크에서 자세히 확인 할 .. 2023. 7. 24.
[c++] 백준 쇠막대기 (10799) 문제 https://www.acmicpc.net/problem/10799 레이저로 쇠막대기를 분리하는 문제 쇠막대기와 레이저 모두 문자열 '('와 ')'로 나타냄 풀이 문자열을 입력 받고, 하나씩 문자를 가져와 '('일 경우에 스택에 쌓음 ')'가 나왔을 시, 레이저로 간주하고 이전까지 쌓은 스택의 사이즈만큼 count. (잘린 쇠막대기 개수) ')'가 나왔을 시, 레이저가 아닌 경우, 쇠막대기를 닫는 경우를 위해 layzer라는 변수를 설정해서 on/off 해줌 layzer=0일 경우, 가장 안쪽의 쇠막대기가 닫히면서 count+1해준다. 코드 알게 된 점 스택의 활용 예외처리가 너무 힘들다 스택 문제라는 틀에 갇혀서 문제풀이가 더 어려워진 것 같다. 아니면 내가 스택을 잘 활용하지 못하거나. git .. 2023. 7. 23.
[c++]백준 균형잡힌 세상(4949), stack, 반례모음 문제 https://www.acmicpc.net/problem/4949 스택으로 수식의 괄호쌍이 올바른지 확인하는 문제 문장에서 소괄호("()") 와 대괄호("[]")로 2종류가 올바르게 열리고, 닫혔는지 판단해야 함 반례모음 ([(]]) no ([)]). . no (())) . no [(()]). . no ( no ( . no 풀이 괄호만 저장하는 스택을 만든다 괄호가 열릴 때, "(" or "["만 스택에 저장한다. 닫힘 괄호가 들어올 때, 현재 스택의 top()이 해당 괄호랑 맞는 쌍인지 판단하고, 맞으면 pop으로 지워주고, 아니면 "no"를 출력한다. 또한, 스택이 비어있는 상태(empty)일 때에도 "no" 출력. 문장의 마지막 "."이 들어올 때, 스택이 비어있으면 "yes" 출력. 단, 스.. 2023. 7. 14.
[c++] 백준 덱(10866) 문제 https://www.acmicpc.net/problem/10866 간단히 덱의 기본동작을 구현하는 문제이다. push_front X: 정수 X를 덱의 앞에 넣는다. push_back X: 정수 X를 덱의 뒤에 넣는다. pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다. pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다. size: 덱에 들어있는 정수의 개수를 출력한다. empty: 덱이 비어있으면 1을, 아니면 0을 출력한다. front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다. .. 2023. 7. 14.
[c++] 백준 회전하는 큐(1021) 문제 https://www.acmicpc.net/problem/1021 문제가 이해가 안됨. 보고 또 보고 이해함. 지민이의 큐는 저 위의 3가지 밖에 동작을 할 수 없다. 따라서, 무조건 첫 번째 원소만 뽑을 수 있고, 뒤에서 뽑을 수 없음 (덱의 구조상 뒤에서 삭제도 가능한데 이것을 생각하면 안됨. 이게 어떻게 덱 문제인지..? --> 자세히 보니 큐 문제이긴 한데, 뒤에서 삽입이 가능해야 하니 덱을 사용해야 한다. 자체적으로 조건을 걸어줘서 풀어야 하는 듯.) 또한, 1번의 연산은 count를 하지 않고, 2번과 3번만 count해야 한다. 그러므로 뽑고자 하는 원소를 최소한의 연산으로 큐의 앞쪽에 위치시키도록 하면 된다. 풀이 1. 덱에 인덱스 번호를 저장해서 초기화 해야 한다. 왜냐하면, 덱에 .. 2023. 7. 14.
[c++] 백준 큐(10845) 문제 정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오. 명령은 총 여섯 가지이다. push X: 정수 X를 큐에 넣는 연산이다. pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. size: 큐에 들어있는 정수의 개수를 출력한다. empty: 큐가 비어있으면 1, 아니면 0을 출력한다. front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다. 입력 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 .. 2023. 7. 13.
[c++] 백준 키로거(5397), 연결리스트, 반례모음 문제 https://www.acmicpc.net/problem/5397 문제 창영이는 강산이의 비밀번호를 훔치기 위해서 강산이가 사용하는 컴퓨터에 키로거를 설치했다. 며칠을 기다린 끝에 창영이는 강산이가 비밀번호 창에 입력하는 글자를 얻어냈다. 키로거는 사용자가 키보드를 누른 명령을 모두 기록한다. 따라서, 강산이가 비밀번호를 입력할 때, 화살표나 백스페이스를 입력해도 정확한 비밀번호를 알아낼 수 있다. 강산이가 비밀번호 창에서 입력한 키가 주어졌을 때, 강산이의 비밀번호를 알아내는 프로그램을 작성하시오. 강산이는 키보드로 입력한 키는 알파벳 대문자, 소문자, 숫자, 백스페이스, 화살표이다. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서.. 2023. 7. 13.
[c++] 백준 에디터(1406), 연결리스트 문제 https://www.acmicpc.net/problem/1406 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다. 이 편집기가 지원하는 명령어는 다음과 같다. L : 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨) D : 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 .. 2023. 7. 13.
[c++] 백준 숫자의 개수(2577), 배열 문제 https://www.acmicpc.net/problem/2577 세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오. 예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다. 입력 첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다. 출력 첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 .. 2023. 7. 13.
3. 배열 - 인덱싱 테이블 이용하여 시간복잡도 줄이기 문제 주어진 길이 N의 int배열 arr에서 합이 100인 서로 다른 위치의 두 원소가 존재하면 1을, 존재하지 않으면 0을 반환하는 함수 func2(int arr[], int N)을 작성하라. arr의 각 수는 0 이상 100 이하이고 N은 1000 이하이다. func2({1,52,48}, 3)=1, func2({50,42},2} = 0, func2({4,13,63,87},4) =1 풀이 배열의 인덱스별로 값들을 카운트하여 시간복잡도를 줄일 수 있음. O(N^2) -> O(N) 합이 100인 수가 있는지 찾는 문제 - 100칸의 배열을 만들고, 주어진 값들을 100에서 뺀 후, 해당 인덱스에 카운트, 만약 값이 1일 경우면 프로그램 종료됨. - 이중 반복을 사용해서 모든 원소값들을 더해서 100이 되는.. 2023. 7. 13.
728x90