본문 바로가기

Java/프로그래머스

[JAVA] 프로그래머스 - 문자열 밀기

https://school.programmers.co.kr/learn/courses/30/lessons/120921

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

 

StringBuilder 초기화, 모든 문자열 삭제 

Java - StringBuilder 초기화, 모든 문자열 삭제 (codechacha.com)

 

Java - StringBuilder 초기화, 모든 문자열 삭제

StringBuilder.setLength(0)는 StringBuilder에 저장된 문자열의 길이를 0으로 변경합니다. 즉 문자열을 empty로 만든다는 것은 이전에 저장한 문자열을 모두 제거한다는 것입니다. 이렇게 StringBuilder를 초기

codechacha.com

 

- StringBuilder 객체를 처음 생성한다면 그냥 new StringBuilder()로 객체를 만들면 되겠지만, 만약 사용하던 StringBuilder를 재사용하는 경우라면, 이전에 추가한 문자열을 StringBuilder에서 삭제하고 재사용해야 한다. 

 

1) StringBuider.setLength()로 StringBuilder의 문자열 비우기 

 

- setLength(0)은 StringBuilder에 저장된 문자열의 길이를 0으로 변경함 

- 즉 문자열을 empty로 만든다는 것은 이전에 저장한 문자열을 모두 제거한다는 뜻 

 

public class Example {

    public static void main(String[] args) {

        StringBuilder builder = new StringBuilder();
        builder.append("Hello World");
        builder.append(", Java");
        System.out.println("sb: " + builder.toString());

        builder.setLength(0);
        System.out.println("sb: " + builder.toString());

        builder.append("Hello World, Java");
        System.out.println("sb: " + builder.toString());
    }
}

/*
sb: Hello World, Java
sb:
sb: Hello World, Java
*/

 

 

정답 

 

- 덱 자료구조 이용하여 풀이 

- 문자열 A를 덱에 삽입하고 맨 뒤에 요소를 제거하고 맨 앞에 추가 하고 answer 증가 

- 바뀐 구조를 StringBuilder를 이용하여 문자열로 만들고 B와 같다면 answer 리턴

 

import java.util.*;

class Solution {
    public int solution(String A, String B) {
        
        Deque<String> deque = new ArrayDeque<>();
        StringBuilder result = new StringBuilder();
        
        int answer = 0; // A를 민 횟수
        
        // A 덱에 삽입
        String str[] = A.split("");
        for (int i = 0; i < str.length; i++) {
            deque.add(str[i]);
        }
        
        // pollLast()한 것을 addFirst()하기
        while (true) {
            if (!deque.isEmpty()) {
                String temp = deque.pollLast();
                deque.addFirst(temp);
            }
            
            answer++; // 민 횟수 증가 
            
            // 문자열 재구성
            result.setLength(0); // StringBuilder 초기화
            for (String s : deque) {
                result.append(s);
            }
            
            if (result.toString().equals(B)) {
                return answer;
            }
            
            // 문자열을 밀어도 B가 되지 않는 경우
            if (answer >= A.length()) {
                return -1;
            }
            
            if(A.equals(B))
                return 0;
        }
    }
}

 

 

다른 사람의 풀이 

 

1)

 

class Solution {
    public int solution(String A, String B) {
        String tempB = B.repeat(3);
        return tempB.indexOf(A);
    }
}

ㄷㄷ

 

 

2)

 

class Solution {
    public int solution(String A, String B) {
        int answer = -1;
        String temp = A;
        for(int i = 0 ; i < A.length() ; i++){
            if(temp.equals(B)){
                answer = i;
                break;
            }
            temp = temp.charAt(A.length()-1) + temp.substring(0, A.length()-1);

        }
        return answer;
    }
}