본문 바로가기

문자열81

[자바] 백준 1897 - 토달기 (boj java) 문제 : boj1897 문제에서 제시된 로직대로 진행한다면, 항상 L 길이의 단어는 L+1 길이의 단어가 된다. 또한 이 때, L 길이의 단어에 있는 각 문자의 순서는 L+1 길이의 단어에서 나타나는 문자의 순서와 동일하면서, 딱 하나의 문자만 추가될 것이다. 그렇다면 현재 L길이의 단어를 보고 있을 때, L+1 길이의 단어들 중 이동 가능한 문자로 진행을 하는걸 더이상 진행할 수 없을때까지 해보면 될 것이다. 즉, 그렇게 안생겼지만 bfs나 dfs로 풀면 된다. 간선은 [L 길이의 문자 A] -> [A와 문자 순서까지 생각했을 때, 1개의 문자만 추가된 문자 B] 와 같이 생성하면 될 것이다. 미리 입력을 받으면서 글자의 길이에 따라 나누어두면 훨씬 효율적으로 진행할 수 있다. 또한 String이므로 .. 2022. 5. 20.
[자바] 백준 25193 - 곰곰이의 식단 관리 (boj java) 문제 : boj25193 결국 중요한건 음식의 리스트를 '원하는 대로' 조정할 수 있다는 점이다. 그럼 'CCCCA' 와 같은 경우를 생각해보자. 어떻게 해야 연속된 C의 최댓값을 최소화시킬 수 있을까? 'CCACC'처럼 A로 나누면 된다. 'CCCCCAB'와 같은 경우엔 어떨까? 마찬가지로 최대한 C를 그 이외의 음식으로 잘게 나누어야 한다. 'CCACCBC'처럼 나누면 될 것이다. 그렇다면, C의 개수를 C가 아닌 것들의 개수로 나누면 될 것임을 알 수 있다. C가 아닌 것을 A라고 한다면 다음과 같은 식을 계산하면 된다(|X|는 X의 개수를 의미함). +1을 한 이유는 예를들어 1개의 벽으로 나눌 수 있는 구역은 2개이고, 2개의 벽으로는 3개가 된다. 그때문에 +1을 해준 것이다. 올림을 하는 이.. 2022. 5. 16.
[자바] 백준 14426 - 접두사 찾기 (boj java) 문제 : boj14426 정해는 대놓고 Trie 쓰라고 낸 거 같은 문제이다. 하지만 N, M, 문자열의 길이가 애매하게 적고 메모리가 상당히 많다. 그래서 밑져야 본전이니 메모리를 많-이 써서 한번 해보고 통과하면 통과되는거고, 안되면 Trie 쓰려고 했는데 이렇게 썼단 이유는 됬다는 그런 얘기이다. 일단 단순히 브루트포스로 풀려고 하면 O(500xNxM) 이므로 불가하다. 하지만 메모리를 더 써서, 미리 N개에 대해 접두사 HashSet을 만들어두면 어떨까? 이 경우 String이라 hash function에 다소 부하는 걸리겠지만, 대강 O(1)이라고 치면 O(500N + M) 으로 가능하다. hash function의 부하를 생각해도 대강 통과는 될 것 같아서 해봤다. 추가로 약간이라도 hash .. 2022. 5. 16.
[자바] 백준 14425 - 문자열 집합 (boj java) 문제 : boj14425 해쉬에 대한 개념을 알고, HashSet 자료구조를 알고 있다면 간단하게 풀 수 있다. N개를 HashSet에 넣고, M개를 입력받으면서 HashSet에 존재하는지 확인하면 된다. 코드 : github import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashSet; import java.util.StringTokenizer; public class Main { private void solution() throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTok.. 2022. 5. 13.
[자바] 백준 8892 - 팰린드롬 (boj java) 문제 : boj8892 각 테스트케이스마다 k가 최대 100개이므로, 모든 쌍을 보더라도 O(T x 100^2)번에 가능하다. 또한 모든 단어의 길이의 합은 10,000이하라고 했으므로, 단어 길이의 합을 L이라 할 때 팰린드롬인지 확인하는 로직이 O(L)짜리 로직이라 하더라도 O(TL x 100^2)으로 가능하다. 또한 팰린드롬인 값이 하나라도 있다면 거기서 종료하면 되므로, 대강 모든 경우를 봐도 시간내에 통과 가능할 것임을 예상할 수 있다. 우선 문자열 S가 팰린드롬인지 확인하는 가장 간단한 방법은, |S/2|까지 인덱스를 증가하면서 앞과 뒤의 문자를 확인하는 것이다. isPalindrome() 함수를 확인해보면 알 수 있다. 그리고 모든 경우를 보는 것은 모든 문자쌍을 만들어보면 된다. 코드의 2.. 2022. 5. 9.
[자바] 프로그래머스 - 신고 결과 받기 (programmers java) 문제 : programmers-신고결과받기 프로그래머스 기준 레벨 1은 에바같고.. 레벨 2정도는 될 것 같다. 백준기준 한 실버5~3정도 수준인듯. 결국 서브 문제로 '잘' 나누고 적절한 자료구조를 '잘' 쓰면 된다. 사실 엄밀히 따지자면 기본적인 자료구조들을 다 알고있다는 가정하에 그냥 제시된대로 단순 구현만 하면 되는 문제니 레벨 1이 맞는것 같기도 하다. 아무튼 내 경우엔 다음의 단계로 나누어서 풀었다. 1. 문자열을 숫자로 매칭 (안해도 되지만, 효율성을 높히려면 하면 좋다) - HashMap 사용 2. 신고당한 횟수를 센다 - int[] 사용 / 이 때 중복되는 신고는 걸러줘야 한다 - HashSet[] 사용 / 이 때 자신을 신고한 사람의 리스트를 유지한다 - ArrayList[] 사용 3... 2022. 5. 1.
백준 11008 자바 - 복붙의 달인 (boj 11008 java) 문제 : boj11008 문제가 명확하지 않아 별로인 문제였다. 예를들어 p가 'bana'이고, s가 'babanana' 일 경우, 이 문제는 'babanana' 중간의 bana 하나만 복붙하고, 나머지 4개는 별도로 출력하여 5가 답이다. 하지만 bana를 복붙 후, 중간에서 bana를 또 붙여넣기하면 2번인걸! 이런 부분에 대한 조건이 제시되어 있지 않았고 그냥 대충 이런거 처리 안하는걸로 제출하니 통과됐다. 좀 아쉽다. 아무튼 그냥 s에서 p가 나온 부분을 세주고, 나머지 부분을 세면 된다. 좀 간단하게 처리하려면 이하 코드처럼 s에서 p를 replaceAll로 전부 문제에 제시될 수 없는 character로 변경해 준 뒤 s의 길이를 출력해주면 된다. 코드 : github import java.i.. 2022. 4. 21.
백준 24510 자바 - 시간복잡도를 배운 도도 (boj 24510 java) 문제 : boj24510 자바의 replaceAll을 사용해 입력으로 들어온 문자열에 포함된 for와 while을 전부 특정 문자로 변경(이하 코드에서는 ','로 변경)한다. 이후 해당 문자의 개수를 세면 문자열에 포함된 for와 while의 개수를 셀 수 있다. 특정 문자로 변경한 이유는 "foforr"과 같은 경우 1번으로 체크되야 하지만, 그냥 for를 제거만 할 경우엔 foforr -> for 이 되어 2번 세질 수 있기 때문이다. 코드 : github import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Excepti.. 2022. 4. 13.
백준 14584 자바 - 암호 해독 (boj 14584 java) 문제 : boj14584 26번에 걸쳐 각 문자를 하나씩 증가시켜보면서, 입력으로 들어온 N개의 문자가 있는지 판단해보면 된다. 예를들어 처음에 'abcd' 였다면, 하나씩 증가시킨단 말은 'abcd' -> 'bcde' -> 'cdef' -> ... 와 같은걸 의미한다. 'arr[j] = (char)('a'+((arr[j]-'a'+1)%26));' 부분이 해당 역할을 한다. 코드 : github import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { private void solution() throws Exception { BufferedReader br = new BufferedReader(new Inpu.. 2022. 4. 10.
백준 9612 자바 - Maximum Word Frequency (boj 9612 java) 문제 : boj9612 String에 대해 카운팅을 해야 한다. 따라서 HashMap 등을 사용하면 쉽게 계산할 수 있다. 주의점은 동일한 횟수가 존재할 경우, 사전순으로 뒤에 있는걸 택해야 한다. 코드에서 이하의 부분이 해당 역할을 한다. maxStr.compareTo(cur) < 0 코드 : github import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashMap; public class Main { private void solution() throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in).. 2022. 4. 9.