[BOJ] 5397: 키로거 (JAVA)
·
Algorithm/자료구조
문제https://www.acmicpc.net/problem/5397 여담이 문제는 에디터 문제랑 거의 유사하다. 에디터 문제를 통해 ListIterator를 다루는 방법을 배웠기 때문에 수월하게 풀 수 있었다!  풀이에디터 문제와 마찬가지로 LinkedList를 ListIterator를 사용해서 풀이하면 된다.  입력한 문자열은 명령어와 문자가 섞인 채로 주어진다. 따라서 각 문자를 하나씩 확인하면서 문자라면 iterator에 저장하고, 명령어라면 그에 맞는 명령을 수행하면 된다. 우선 LinkedList 객체에 listIterator() 메소드를 사용해서 ListIterator 객체를 생성한다. 그 후, 각 문자에 따라 다음의 과정을 반복한다.- 인 경우 (백스페이스)이전 문자가 존재하는 경우: it..
[BOJ] 1406: 에디터 (JAVA)
·
Algorithm/자료구조
문제https://www.acmicpc.net/problem/1406 여담처음에 LinkedList를 사용해서 풀었더니 시간 초과가 발생했다. 아마 LinkedList에서 원하는 위치를 찾아가는 시간이 O(N)이라 그런 것 같다. 풀이를 참고하니 ListIterator라는 인터페이스를 사용해서 LinkedList를 편리하게 탐색할 수 있다는 것을 알게 되었다. LinkedList와 ListIterator에 대해 공부하고 정리해야 되겠다..! 풀이LinkedList와 ListIterator를 사용해서 풀이하면 된다. 이 문제는 ListIterator의 사용법을 익히는 문제라고 볼 수 있다. 따라서 ListIterator의 메소드를 조건에 맞게 적절하게 사용하면 된다.  우선 입력받은 문자열을 LinkedL..
[BOJ] 18870: 좌표 압축 (JAVA)
·
Algorithm/정렬
문제https://www.acmicpc.net/problem/18870 여담처음에 HashSet으로 중복을 제거하고 List로 변경한 뒤 HashMap에 저장하는 식으로 문제를 풀었다. 이렇게까지 하지 않아도 풀 수 있을 것 같아서 다른분의 풀이를 참고했다. HashSet과 List를 사용하지 않고 HashMap만을 이용해서 풀이할 수 있는 방법이 있다는 것을 알게 되었다..ㅎ 문제를 풀 때 너무 빙 둘러서 푸는 습관을 고쳤으면 좋겠다. 그리고 변수명도 좀 센스있게 짓고 싶다.. 다른 분 풀이 참고할 때마다 내 변수명이 너무 초라해 확실히 배열과 HashMap만을 이용해서 푸는 것이 메모리와 시간을 덜 잡아먹었다...! 풀이이 문제는 좌표에 좌표 압축을 적용하는 것으로, 좌표들의 대소관계만 필요하다. 따..
[BOJ] 17276: 배열 돌리기 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/17276 여담시계 방향으로 회전하는 것과 반시계 방향으로 회전하는 것을 나눠서 풀었는데, 해당 블로그를 보고 반시계 방향을 따로 구현하지 않아도 된다는 것을 알았다..! 처음에 제대로 정리를 하지 않고 풀었더니 좌표를 이동시키는 과정에서 조금 헷갈렸고, 중간값에 -1을 해주지 않아서 조금 헤맸다..ㅎ  제발 문제를 풀기 전에 잘 정리하고 풀라고... 풀이이 문제는 단순 구현이기 때문에 문제에서 주어진 조건대로 구현하면 된다. 이때, 반시계 방향은 d + 360도 시계 방향으로 회전시키는 것과 같기 때문에 시계 방향으로 회전하는 것만 구현하면 된다.  문제에서 주어진 조건은 다음과 같다.X의 주 대각선을 ((1,1), (2,2), …, (n, ..
[자료구조] 스택(Stack)이란?
·
Algorithm/자료구조
스택의 개념스택은 '쌓다'와 같은 뜻을 가진 용어로, 접시를 쌓아 놓은 형태와 비슷한 자료구조즉, 데이터를 순서대로 쌓는 자료구조마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 후입선출(LIFO: Last In First Out) 구조가장 마지막에 들어온 데이터를 먼저 처리할 때 사용사용처웹 브라우저의 '뒤로가기'실행 취소(뒤돌리기)의 'undo'수식 계산 또는 수식 괄호 검사... 스택의 특징후입선출(LIFO) 구조가장 늦게 들어온 데이터가 제일 먼저 빠져나가는 구조단방향 입출력 구조데이터가 들어오는 방향과 나가는 방향이 같음정해진 방향으로만 쌓을 수 있음데이터를 하나씩만 넣고 뺄 수 있음깊이 우선 탐색(DFS)에 이용재귀 함수의 동작 흐름과 같은 구조를 가짐 자바에서 스택 사용하기메서드설명Stack ..
[BOJ] 22858: 원상 복구 (small) (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/22858 여담문제 이해만 하면 쉽게 풀 수 있는 문제였는데 문제 자체를 이해하지 못해서 시간을 좀 날렸다..ㅎㅎ 독해력 대체 무슨일이야풀이문제에 따르면 "Di번째 카드를 i번째로 가져오는 것이 셔플"이라고 한다. 개인적으로 이 문장을 이해하는게 조금 어려웠기 때문에 예제로 주어진 입력에 설명을 덧붙여보겠다. i가 1인 경우D1번째 카드를 1번째로 가져와야 함 (D[1] = 4)즉, 4번째 카드를 1번째로 가져와야 함S[1] = P[D[1]] = P[4] = 3i가 2인 경우D2번째 카드를 2번째로 가져와야 함 (D[2] = 3)즉, 3번째 카드를 2번째로 가져와야 함S[2] = P[D[2]] = P[3] = 5...i가 5인 경우D5번째 카드..
[BOJ] 20291: 파일 정리 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/20291 여담문제를 풀고난 뒤, 코드가 깔끔하지 않은 것 같아 다른 풀이들을 참고했다. 해당 블로그에서 엄청 깔끔하게 코드를 짰길래 참고해서 다시 풀었다. 항상 깔끔하게 풀지 못하는 것 같아 조금 아쉽다.. 좀 깔끔하게 푸는 습관을 들이도록 해야지!  풀이확장명을 구하기 위해 입력받은 문자열을 .로 split()한다. split()한 결과의 첫 번째 문자열은 파일명, 두 번째는 확장명일 것이다. 따라서 필요한 두 번째 문자열만 사용하면 된다. 그 후 과정은 다음과 같다.HashMap을 사용해서 입력받은 파일의 확장명이 존재하는지 확인한다.hashMap.containsKey(file)확장명이 존재하는 경우라면, 파일의 수를 1 증가하여 Hash..
[BOJ] 12933: 오리 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/12933 여담문제를 풀고 난 뒤, 종료 조건을 체크하는 부분이 조금 아쉬워서 다른 풀이들을 참고했다. 해당 블로그의 글을 읽고 아이디어가 떠올라서 새로 풀었다. 처음에는 울음소리를 확인할 때, 확인한 울음 소리들을 리스트에 저장하고 올바른 울음소리일 때만 방문 처리를 했었다. 이는 문제를 제대로 이해하지 못하고 풀었기 때문에 정석?으로 푸는 방법이 아니었다. 예제 6번을 뒤늦게 보고 문제를 잘못 이해했다는 것을 알게 되었다. "제대로 울지 않는 오리가 있어도 제대로 우는 오리의 수만 구하면 된다"라고 생각했는데, 제대로 울지 않는 오리가 하나라도 있으면 녹음한 소리가 올바르지 않은 것이었다..ㅎㅎ 문제를 처음부터 잘 이해했더라면 최적화된 방법..
[BOJ] 1913: 달팽이 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/1913 여담처음에 DFS 방식으로 문제를 풀었다. 메모리를 너무 많이 사용하길래 이 방식이 맞나싶어서 다른 풀이를 봤더니 그냥 순수 구현으로 풀 수 있는 문제였다..  순수 구현으로 푼 문제와 DFS 탐색을 통해 푼 문제의 메모리 차이가.. ㅎㅎ 풀이이 문제는 "안 → 밖" 또는 "밖 → 안"의 순서대로 하나씩 칸을 채워나가면 된다. 나는 밖에서 안으로 채우는 방식을 사용했다. 다음 사진에서 알 수 있듯이 "아래 → 오른쪽 → 위 → 왼쪽" 방향이 반복된다. 따라서 (0, 0)에서 시작해서 한 방향으로 이동하다가, 다음에 이동할 지점이 범위를 벗어나거나 이미 값이 기록된 곳이라면 방향을 변경하면 된다. 범위를 벗어난 경우x + dx[i] = ..
[BOJ] 7569: 토마토 (JAVA)
·
Algorithm/BFS & DFS
문제https://www.acmicpc.net/problem/7569 여담토마토 문제와 거의 유사하다. 다른 점은 2차원에서 3차원으로 변경됐다는 것 정도? 그래서 문제 제목도 같나 보다. 토마토 문제를 풀고 바로 푸는 것이라 쉽게 풀 수 있었다. 풀이토마토들이 다 익는 최소 일수를 알고 싶은 것이므로 BFS 탐색을 수행하면 된다. 언급했듯이 이전에 풀었던 토마토 문제와 거의 유사하므로, 풀이 방법은 토마토 풀이 게시글을 참고하면 된다.  주의해야 할 점은 2차원이 아니라 3차원이라는 점이다. 따라서 상하좌우뿐만 아니라 위, 아래로도 BFS 탐색을 수행해야 한다. 코드import java.util.*;import java.io.*;public class Main { s..