1) 생각 첫 번째 생각 주어진 시간이 30초이고 A의 길이도 10000 이하이므로 A를 처음부터 쭉 훝으면서 B와 첫글자가 같으면 그 뒤로 B가 나오는지 확인하면서 B가 나온다면 반복문 변수를 B의 길이 -1 만큼 해준뒤 다시 검색하는 방식을 생각해보았다. 예제로 주어진 상황은 통과했지만 답안을 제출하니 'Runtime error'가 떳다. 생각을 해보니 만약 A의 마지막 글자가 B의 첫글자와 같다면 조건문이 만족되므로 안으로 들어가서 해당 index에서 B의 길이만큼 A를 자른 문자열이 B와 같은지 판단할 때 A의 길이를 벗어나므로 오류가 나게된 것이다. 두 번째 생각 첫 번째를 변형해도 풀 수 있겠지만 다른 방식으로 접근을 생각해보았다. 문자열 메소드 중 indexOf라는 메소드를 이용하여 첫 번째..
1) 생각 주어진 칼로리의 값을 넘지 않도록 더해가면서 맛의 만족도가 최대가 되는 값을 구하자. 재료의 수가 최대 20개로 많지 않으므로 주어진 시간인 Java 8초를 생각하면 모든 조건을 따져봐돠 충분히 풀 수 있을것이다. 2) 방안 재귀를 통한 DFS 방식을 통해 쭉욱 살펴보면서 그 값이 더해졌을 경우, 더해지지 않았을 경우를 따지면 된다. 12345678910111213141516171819202122232425262728293031323334353637383940414243import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;import java.u..
1) 생각 주어진 부등호 조건을 만족하는 제일 작은 수와 제일 큰 수를 구해야한다. 특징으로 0도 포함된다. 모든 수를 한 번씩만 쓸 수 있으므로 방문 조건을 추가해서 각 수마다 0~9까지 비교해서 판단하였다. 0부터 쭉 비교해서 나아가면 자연스럽게 List에 추가되어있는 수중 Index 0에 저장된 수가 작은 수 마지막에 저장된 수가 가장 큰 수가 된다. 조건 문을 통해 를 판단하고 if문을 통해 이전 숫자와 현 숫자를 비교하였는데 자꾸 오류가나서 살펴보니 한 줄이라 조건문에 { } 를 사용하지 않고 작성하였더니 이클립스가 맨 위의 if문과 짝지어져어할 else if문을 문단에 상관없이 계속 바로 위의 if문과 짝지어줘서 그런것이였다. 2) 방안 조건문에 { }를 추가하여 구분하여줬다. 0~..
1) 생각 숫자 N을 주어준 후 1부터 N까지 숫자를 쭉 이었을 경우 그 숫자의 자리수를 구하라.1) 첫번째 생각시간이 1초로 주어졌고 N의 범위가 1부터 1억 까지이므로 될까? 싶어서 반복문을 통해 1부터 N까지 돌리면서 그 숫자의 길이를 구해 계속 더해주었다. 약간 느리고 메모리를 많이 잡아먹었지만 '맞았습니다'가 표시되었다. 아마 위의 방법으로는 숫자가 좀 더 크게 주어지면 '틀렸습니다'가 표시될 것이므로 다른 방법을 생각해보았다.2) 방안더 좋은 방법이 무엇일까? 처음 N이 100으로 주어지면 1~99 까지는 무조건 포함이 된다. 여기에 다음과 같은 규칙이 들어간다.1~9는 9개10~99는 90개100~999는 900개... 뒤에는 계산해 보지 않았지만 계속 저렇게 늘어날 것이 분명하다. 자연에는..
1) 생각 문제는 아주 심플하다 1) 첫번째 생각M,N 값에 대응하는 값을 1부터 쭉 올리면서 M,N에 도달하면 없는것으로 판단하여 -1을 출력하였다.위의 시도는 바로 '시간초과'를 받았고 다른 생각을 해보아야했다. 2) 두번째 생각M값을 고정시키고 N을 +M만큼 해준 후 차이를 N 범위를 넘어서게되면 -N을 해주어 처리를 하였다.처음 M 값을 고정했을 때의 N에 대응하는 값을 가지고 새롭게 변한 tN 값과 비교를 해주면서 tN값이 다시 처음의 N 값으로 돌아왔다면 한 바퀴를 돌았다는 것이므로 대응하는 숫자가 없다고 판단하고 '-1'을 출력하였다.=> 이경우 -N으로 처리하였는데 '틀렸습니다'가 아닌 '시간초과'를 받았기에 잘못된 부분을 발견하는데 조금 걸렸다.M이 클경우 tN값에 +M을 해주어 N이 넘..
1) 생각 무슨말일까 했는데 아래와 같은 블록의 형태를 의미한다. 다른 블록의 형태의 경우에는 탐색을 통해 만들 수 있지만 'ㅜ' 형태의 모양은 만들기 어렵다.딱, 저형태만 되는것은 아니고 저 도형이 회전한 모양이면 어느 모양이던 가능하다.처음 Stack으로 DFS를 구현해보고 재귀를 통해서도 구현해 본결과 Stack으로 구현할 경우 '맞았습니다'는 뜨지만 반복작업이 많아지므로 메모리와 실행시간이 다음과 같이 차이가 나게된다.그리고 이 문제처럼 입력이 띄엄띄엄 많이 주어진 경우 Scanner와 BufferedReader의 능력 차이를 쉽게 알아볼 수 있으므로 같은 코드에서 문자열 입력을 다르게 했을 때 생기는 차이는 다음과 같다.(Scanner는 1024chars의 버퍼 사이즈를 BufferedReade..
1) 생각 큰 고민없이 리모콘 숫자만 맞추는 식으로 코드를 작성한 후 '틀렸습니다'를 맛보고 고민을 해서 코드를 작성하였다. 2) 방안 최대 999999 개만 살펴보면 되므로 모든 Case를 살펴보았고, 각각의 숫자를 검사하여 고장난 버튼의 숫자가 있으면 건너뛰고 그렇지 않으면 N값 과의 차이와 그 숫자를 min으로 저장해 둔 후 min의 최소값이 되는시점(N값과의 차이가 가장 작은시점 -> 0부터 검사하므로 점점 작아지다 최저 값을 찍은 뒤 점점 커짐) 에서 반복문을 빠져나왔다.이후 한 번 더 틀린것을 확인하고 101 같은경우 위의 반복문만 확인하면 4가 나오겠지만 기본 채널이 100번이므로 +1만 해주면되는것을 발견하고 100과 N의 차와 위에서 구한 최소값을 비교하여 최소값을 출력하였다. 12345..
1) 생각 우선 이동해야하는것이 2가지이다. 하나는 고슴도치(S)이고 다른 하나는 물(*)이다. 비버(D)와 돌(X)은 움직이지 않으므로 if 문 처리만 잘 해주고 신경쓰지 않는다.침수 예정 지역으로 고슴도치가 이동해서는 안되므로 맨 처음에 물을 먼저 퍼트리는것이 편하다 생각하였다. 2) 방안 물을 맨 처음 퍼트리면 이것은 예상 경로를 미리 놓은 것이기 때문에 물이 한 턴 앞서나가게된다. 따라서 반복문에 들어가기전 한 번 수행후 물의 퍼트림을 1번 쉬어줌으로서 맨 처음 예상 침수 경로만 만들어 놓고 진행하였다. 물의 경우 마지막 퍼트린 지점만 알고있으면 되고, 또 물이 처음에 여러개 등장할 수 있으므로 list로 만들어준후 이전 좌표를 List에서 제거하면서 생성하였다.고슴도치와 물의 이동경로 좌표를 위..
1) 생각 최단 시간을 찾아야하므로 BFS를 이용하여 각 n을 방문해보면서 이미 방문한 지점은 제외하고 k 지점에 도착하는 순간을 찾으면된다. 똑같은 숨바꼭질 문제가 여럿있고 다 비슷한 풀이 방식을 요구한다. 이문제의 경우 다른 점은 최소값 이외에도 최소값에 맞춰서 몇 번이나 도달할 수 있는가를 물어본다. 2) 방안 최소값만 찾으면 될 경우 break 문을 통해 바로 빠져나왔겠지만 그 숫자도 알아야하므로 BFS의 특징인 단계별로 나아간다는 점이 있으므로(뒤로, 앞으로, *2가 모두 +1 씩이므로) 일반적인 BFS 방식으로 풀수있다. 처음 도착하는 값이 최소 값이므로 그 값을 보관해두고 개수를 세고 다른 이전 값과 다른 값이 들어오면 카운트 변수인 cnt를 올리지 않고 반복문을 종료시켰다. 12345678..
1) 생각 문제를 보니 백준님과 알고스팟 운영진분이 친하신가? 라는 생각을 한 번 하게되는 문제였다. 일반적인 Queue를 사용하여 BFS 방식으로 푸니 시간 초과가 발생하였다. 2) 방안 가중치가 최소화 되는 값만 찾으면되므로 다익스트라 방식으로 PriorityQueue로 바꾸어서 가중치가 최소인 값을 우선 탐색하도록 하였다. (PriorityQueue를 사용시 변수가 여러개이면 Compartor나 Comparable을 이용하여 Sorting을 위한 분류 종류를 만들어주어야한다.) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263import j..
- Total
- Today
- Yesterday