직사각형 종이를 n번 접으려고 합니다. 이때, 항상 오른쪽 절반을 왼쪽으로 접어 나갑니다. 다음은 n = 2인 경우의 예시입니다. 먼저 오른쪽 절반을 왼쪽으로 접습니다. 다시 오른쪽 절반을 왼쪽으로 접습니다. 종이를 모두 접은 후에는 종이를 전부 펼칩니다. 종이를 펼칠 때는 종이를 접은 방법의 역순으로 펼쳐서 처음 놓여있던 때와 같은 상태가 되도록 합니다. 위와 같이 두 번 접은 후 종이를 펼치면 종이에 접은 흔적이 생기게 됩니다. ∨ 모양이 생긴 부분은 점선(0)으로, ∧ 모양이 생긴 부분은 실선(1)으로 표시했습니다. 종이를 접은 횟수 n이 매개변수로 주어질 때, 종이를 절반씩 n번 접은 후 모두 펼쳤을 때 생기는 접힌 부분의 모양을 배열에 담아 return 하도록 solution 함수를 완성해주세요..
'a'와 'b'로만 이루어진 문자열에서 같은 문자가 세 번 연속하는 경우를 포함하지 않는 substring 중 가장 긴 것의 길이를 구하는 문제이다. 이전 문자를 기억하기 위한 char형 변수와 연속한 문자가 이전 문자와 동일한지 여부를 체크하는 boolean 값을 이용해서 문자열의 현재 인덱스에서 같은 문자가 세 번 연속 등장했는지 검사한다. 분기문을 설명하자면, 현재 확인하고 있는 위치의 문자가 이전 문자와 같은 경우는 두 가지 경우로 나눌 수 있다. 같은 문자가 두 번째 등장한 경우와 세 번 이상 등장한 경우이다. 두 번째 등장했다면 identical의 값을 true로 변경하고 세 번째 등장할 경우를 대비한다. 그러고 나서 등장하는 문자가 이전과 다르다면 identical의 값을 false로 되돌리..
오늘 본 테스트는 내게는 너무나 어려웠다. 시간이 충분하다면 재밌게 풀 수 있는 문제들이었던 것 같은데 시간 분배에 아주 실패했다. 우선 4개의 문제를 둘러보고 먼저 시작할 문제를 골라 시작했는데, 계속 조금만 더 디버깅해보면 될 것 같은 생각에 붙잡고 있다가 시간이 흐르고 다른 문제를 풀기 시작하기에는 시간이 부족할 것 같아서 이 문제라도 풀어내야겠다 하고 끝까지 붙잡고 있다가 시험이 끝난 뒤에도 한참 디버깅하고, 점심 먹고 다시 앉아 함수를 분리해서 코드를 다시 짜보았다. 입력으로 플레이어 수와 매 턴에 플레이어가 뽑아서 나온 카드가 순서대로 주어진다. 게임에는 A, J, Q, K 네 가지 카드가 사용되고, 각 카드마다 수행 내용이 다른데 마지막에 각 플레이어가 가지게 되는 사탕의 개수를 출력하는 것..
문제를 풀고 제출했는데 시간 초과! 완전 탐색을 하기 위해 재귀를 이용하긴 했지만 꼭 필요한 경우만 돌았는데도 시간 초과라 의아했다. 완전 탐색이 아닌 다른 방법으로 푸는 방법도 있겠지만 Math.max() 메서드 사용이 시간 지연의 원인일 수도 있겠다는 생각이 들었다. 대충 검색을 해보니 Math.max()의 성능이 그리 좋지 않다는 것을 확인할 수 있었다. 그래서 삼항 연산자, 비교 연산자, Math.max()를 이용한 최댓값 구하기의 속도를 비교해 보았다. public class Test { public static void main(String[] args) { long start = 0, end = 0; long[] time = new long[4]; int fastest = 0; int[] a..
https://www.acmicpc.net/problem/1021 1021번: 회전하는 큐 첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 순서대로 주어진다. 위치는 1보다 크거나 같고, N보다 작거나 같은 자연수이다. www.acmicpc.net 처음에는 디큐로 구현을 시도했다. Deque dq = new ArrayDeque(); 타깃 넘버가 큐의 맨 앞으로 올 때까지 연산을 반복하며 연산 횟수를 구했다. 그리고 총 연산 횟수에는 가까운 쪽으로 이동시킨 경우의 연산 횟수를 더해 주었고, 타깃 넘버를 큐에서 제거하며 하나씩 처리했다. int result = ..
배열로 이루어진 행렬 자체에서 값들을 이동시켰다면 테두리의 크기에 따라 달라지는 2차원 인덱스를 처리하기 훨씬 까다로웠을 것이다. 테두리 값을 리스트에 가져와서 Collections 클래스의 rotate() 메서드를 사용해 따로 버퍼를 두지 않고도 쉽게 회전 이동을 처리했고, 다시 배열에 되돌려 놓았다. 한 번 실행될 때마다 회전 방향은 반대로 바꿔주었다. 문제를 풀기 전에 신경 썼던 것은 주어진 행렬의 크기에 따른 테두리 길이의 변화와 회전수의 값이 클 때 이를 주기로 나누어서 해결하는 것, 결과를 출력할 때 각 행이 공백 문자열 없이 개행(\n)으로 끝나는 것이었다. import java.util.*; public class Test { public static void main(String[] ar..