일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- MySQL
- docker명령어
- WeNews
- 참조키
- AuthenticationEntryPoint
- Query
- 2 > /dev/null
- application.yml
- appspec
- 적용우선순위
- 메소드명
- 외부키
- ubuntu
- 포트
- subquery
- 예약
- 서브쿼리
- 커밋메세지수정
- 추후정리
- querydsl
- appspec.yml
- 테스트메소드
- EC2
- 메세지수정
- 검색
- foreignkey
- 테스트
- ㅔㄴ션
- 네이티브쿼리
- 컨테이너실행
Archives
- Today
- Total
제뉴어리의 모든것
[백준] [Silver5] 1251 - 단어나누기 [Brute Force] 본문
문제
단어 나누기
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 | 128 MB | 8402 | 3531 | 2995 | 46.148% |
문제
알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다.
먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다. 각각은 적어도 길이가 1 이상인 단어여야 한다. 이제 이렇게 나눈 세 개의 작은 단어들을 앞뒤를 뒤집고, 이를 다시 원래의 순서대로 합친다.
예를 들어,
- 단어 : arrested
- 세 단어로 나누기 : ar / rest / ed
- 각각 뒤집기 : ra / tser / de
- 합치기 : ratserde
단어가 주어지면, 이렇게 만들 수 있는 단어 중에서 사전순으로 가장 앞서는 단어를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 영어 소문자로 된 단어가 주어진다. 길이는 3 이상 50 이하이다.
출력
첫째 줄에 구하고자 하는 단어를 출력하면 된다.
예제 입력 1 복사
mobitel
예제 출력 1 복사
bometil
풀이
단순하게 접근했다.
두 부분을 골라서 3등분 한다고 하였기 때문에
3등분 된 부분 문자열의 범위를 증가시키면서 모든 조합을 찾아냈다.
만약 abcdef 가 있다면
최초엔
a
b
cdef
으로 나누고 그 다음은
a
bc
def
...
a
bcd
ef
...
a
bcde
f
...
ab
c
def
..
이런식으로 각 부분들의 범위를 넓히면서 모든 조합을 List에 다 담은 뒤
List를 정렬하여 0번째 요소를 출력하였다.
참고로,
java의 substring 메소드는
public String substring(int beginIndex, int endIndex)
위와 같이 되있어서 헷갈릴 수 있지만,
beginIndex의 요소는 포함하고, endIndex의 요소는 포함하지 않는 부분 문자열을 반환한다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class B1251_단어나누기 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str = bf.readLine();
List<String> list = new LinkedList<>();
for (int i = 1; i < str.length() - 1; i++) { // 0부터 i < str.length() - 1 인덱스까지 (까지의 인덱스를 포함 X)
for (int j = i+1; j < str.length(); j++) {
String s1 = reverse(str.substring(0, i));
String s2 = reverse(str.substring(i, j));
String s3 = reverse(str.substring(j));
list.add(s1 + s2 + s3);
}
}
Collections.sort(list);
System.out.println(list.get(0));
}
static String reverse(String str) {
StringBuilder sb = new StringBuilder(str);
return sb.reverse().toString();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] [Silver2] 18111 - 마인크래프트 (1) | 2024.02.24 |
---|---|
[백준] [Silver4] 1120 - 문자열 [Brute Force] (0) | 2023.04.25 |
[백준] 1697 - 숨바꼭질 [그래프,BFS] (0) | 2023.02.26 |
[백준] 1715 - 카드 정렬하기 [그리디] (0) | 2023.02.09 |
[백준] 2750번 - 수 정렬하기 (삽입 정렬) (0) | 2022.10.04 |