새소식

Programmers Coding Test/Java

[프로그래머스 120886] Java - 코딩테스트 입문 / A로 B 만들기

  • -

 

A로 B 만들기

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

 

1)  문제

문자열 before와 after가 매개변수로 주어질 때, 
before의 순서를 바꾸어 after를 만들 수 있으면 1을, 
만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한사항
0 < before의 길이 == after의 길이 < 1,000
before와 after는 모두 소문자로 이루어져 있습니다.

 

 

 

2)  예시

 

 

Result Table
before after result
"olleh" "hello" 1
"allpe" "apple" 0

 

 

입출력 예 #1
"olleh"의 순서를 바꾸면 "hello"를 만들 수 있습니다.


입출력 예 #2
"allpe"의 순서를 바꿔도 "apple"을 만들 수 없습니다.

 

 

 

 

3)  풀이

 

0. Arrays 메소드를 이용하기 위해 java Utility Arrays를 가져옵니다.

● import java.util.Arrays;

 

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 문자열 before과 after 두개를 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수를 반환하므로 데이터타입을 int으로 합니다.

●   public int solution(String before, String after) {

 

 

 

3. 두 문자열을 알파벳순으로 정렬하고, 정렬된 것이 동일하다면 순서를 바꾸어 동일한 문자를 만들 수 있다는 뜻입니다.

정렬하기위한 Arrays 클래스의 sort메소드를 사용하기 위해 문자배열 beforeArr과 afterArr을 만들어줍니다.

(toCharArray() 메소드는 문자열을 문자 배열로 변환합니다)

그리고 sort메소드를 이용하면 알파벳순으로 정렬되게 됩니다.

●      char[] beforeArr = before.toCharArray();
        char[] afterArr = after.toCharArray();
        Arrays.sort(beforeArr);
        Arrays.sort(afterArr);
        

 

 

 

4. 두 문자배열이 동일한지 확인하기 위해, 다시 문자열로 만들어줍니다.

(new String(char[]) 생성자는 문자 배열을 문자열로 변환합니다)

String메소드의 equals 메소드를 이용하여 문자열 sortedBefore와 sortedAfter를 비교해주고,

동일하다면 1을 반환, 아니면 0을 반환해줍니다.

●   String sortedBefore = new String(beforeArr);
     String sortedAfter = new String(afterArr);

        return sortedBefore.equals(sortedAfter) ? 1 : 0;
    }
}


 

 

 

 

 

4)  코드

 

import java.util.Arrays;

public class Solution {
    public int solution(String before, String after) {

        char[] beforeArr = before.toCharArray();
        char[] afterArr = after.toCharArray();
        Arrays.sort(beforeArr);
        Arrays.sort(afterArr);


        String sortedBefore = new String(beforeArr);
        String sortedAfter = new String(afterArr);

        return sortedBefore.equals(sortedAfter) ? 1 : 0;
    }
}

 

 

 

 

 

 

 

5)  느낀점

 

 

● 처음 제출했었던 오답

답 체크를 해보고나서야 바보같았단 사실을 깨달았습니다.

before 문자열과 after 문자열을 하나씩 비교하는 과정에 같으면 계속 체크하게하고,

아닐 경우 0을 반환하고 끝내게 하려고했는데 생각과는 다른 코드를 짰습니다.

 

지금 같은 코드의 경우 beforePart와 afterPart가 모두 동일해야만 1이 나올 수 있게 됩니다. (대부분 0이 나옴)

또한, beforePart와 afterPart의 알파벳이 중복되게 나올 경우를 해결하지 못합니다.

class Solution {
    public int solution(String before, String after) {
        int answer = 0;
  
        for(int i=0; i < before.length(); i++){
            char beforePart = before.charAt(i);
            for(int j=0; j < after.length(); j++){
                char afterPart = after.charAt(j);
                if(beforePart == afterPart){
                    answer = 1;
                } else {
                    answer = 0;
                }
            }
        }
        
        return answer;
    }
}

 

 

 

 

● 위 오답을 해결하기위해 수정했던 코드

public class Solution {
    public int solution(String before, String after) {
        // 두 문자열의 길이가 다르면 0 반환
        if (before.length() != after.length()) {
            return 0;
        }

        // 각 문자의 빈도수를 저장할 배열
        int[] beforeCount = new int[26];
        int[] afterCount = new int[26];

        // before 문자열의 각 문자의 빈도수 증가
        for (int i = 0; i < before.length(); i++) {
            beforeCount[before.charAt(i) - 'a']++;
        }

        // after 문자열의 각 문자의 빈도수 증가
        for (int i = 0; i < after.length(); i++) {
            afterCount[after.charAt(i) - 'a']++;
        }

        // 두 문자열의 빈도수를 비교
        for (int i = 0; i < 26; i++) {
            if (beforeCount[i] != afterCount[i]) {
                return 0; 
            }
        }

        return 1;
    }

}

 

이 경우, 위 오답을 해결해 줄 수 있었습니다.

before.charAt(i) - 'a' 를 해주면, a - a = 97 - 97 = 0으로 0번째 인덱스를 확인하게되고,

총 26개의 인덱스를 모두 확인해주는 순환을 할 수 있게 됩니다.

 

 

위 설명한 정렬을 이용한 방식과 비교해보았을 때 제 결론은 아래와 같았습니다.

 

1. 코드의 간결성

정렬을 이용한 방식이 코드가 더 짧고 가독성이 좋았습니다.

 

2. 효율성

정렬을 이용할 경우, 두개의 문자열을 각각 정렬(두번)해야하는 시간이 소요되고,

카운팅을 이용할 경우, 두개의 문자열을 '한번' 비교하게되니 더 짧은 시간이 소요되게 됩니다.

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.