나를 기록하다
article thumbnail
반응형

백준(baekjoon) 1181 단어 나누기

1. Python

풀이

word = list(input())
answer = []
temp = []

for i in range(1,len(word)-1):
    for j in range(i+1, len(word)):
        a = word[:i]
        b = word[i:j]
        c = word[j:]
        a.reverse()
        b.reverse()
        c.reverse()
        temp.append(a+b+c)
        
for piece in temp:
    answer.append(''.join(piece))
    
print(sorted(answer)[0])

코드설명

python과 java를 함께 사용하여 문제를 풀이하니 python이 알고리즘 풀이에 있어서 얼마나 유용한지 새삼 느낀다.

입력부터 list로 받아와서 이중 for문을 이용하여 3등분을 할 구간인 i와 j에서 0~i-1(a), i~j-1(b), j~len(word)(c) 구간별로 구한 다음, 각각 구간을 뒤집은 값의 합을 미리 선언해둔 빈 공간의 배열인 temp에 추가한다.

temp에 있는 값들을 빈 문자열로 구분하여 합쳐서 하나의 문자열로 만들고, 그 결과를 answer에 추가한다.

마지막으로 answer을 정렬하여 0번지에 있는 가장 작은 값을 출력한다.

 

2. Java

풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }


    public void solution() throws Exception {
        String s = br.readLine();
        int len = s.length();
        List<String> arr = new ArrayList<>();
        for (int a = 1 ; a < len ; a++) {
            for (int b = a + 1 ; b < len ; b++) {
                arr.add(getWord(s, a, b));
            }
        }
        Collections.sort(arr);
        System.out.println(arr.get(0));
    }

    private String getWord(final String s, final int a, final int b) {
        StringBuilder s1 = new StringBuilder(s.substring(0, a));
        StringBuilder s2 = new StringBuilder(s.substring(a, b));
        StringBuilder s3 = new StringBuilder(s.substring(b));
        StringBuilder sb = new StringBuilder();
        sb.append(s1.reverse()).append(s2.reverse()).append(s3.reverse());
        return sb.toString();
    }
}

코드설명

1. Scanner보다 BufferedReader가 훨씬 빠르기 때문에 백준 알고리즘 문제풀이를 할 때는 BufferedReader와 InputStreamReader을 이용한다. 그리고 한 번 값을 입력받은 후 변경되지 않도록 public static final로 선언한다.

 

2. 다음으로 반환값이 없는 solution 메서드를 선언하는데, br.readLine()을 통해 문자열 s를 입력받는다.

정수형 len은 문자열 s의 길이를 의미하고 문자열 배열 arr을 ArrayList를 생성하여 가능한 모든 부분 문자열을 저장한다.

그리고 이중 for문을 이용하여 문자열에서 가능한 모든 부분 문자열을 추출한다.

 

3. getWord라는 메서드를 선언한다. getWord는 문자열 s, 정수형 a, 정수형 b를 매개변수로 입력받는다.

StringBuilder 객체 s1 ~ s3까지 선언하여 각각 0~a-1, a~b-1, b~끝까지 부분 문자열을 저장하고 객체 sb에서 s1~s3을 역순으로 결합하여 반환한다.

 

4. solution 메서드 내에서 이렇게 저장된 arr을 정렬하고 0번지 값(최솟값)을 출력한다.

 

5. 객체지향적으로 구현된 코드를 main메소드에서 new Main().solution();을 통해 클래스 내 메소드를 구현한다.

 

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...