새벽코딩

[백준] [6996] 애너그램 본문

알고리즘

[백준] [6996] 애너그램

J 코딩 2022. 11. 24. 00:19
반응형

문제

두 단어 A와 B가 주어졌을 때, A에 속하는 알파벳의 순서를 바꾸어서 B를 만들 수 있다면, A와 B를 애너그램이라고 한다.

두 단어가 애너그램인지 아닌지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수(<100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 100을 넘지 않는 단어가 공백으로 구분되어서 주어진다. 단어는 알파벳 소문자로만 이루어져 있다.

출력

각 테스트 케이스마다 애너그램인지 아닌지를 예체 출력과 같은 형식으로 출력한다. 

출력 형식

정확한 출력 형식은 제출에서 언어를 Java로 설정하면 확인할 수 있다.

예제 입력 1 복사

3
blather reblath
maryland landam
bizarre brazier

예제 출력 1 복사

blather & reblath are anagrams.
maryland & landam are NOT anagrams.
bizarre & brazier are anagrams.

 

※풀이

 

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class Main {

    private static boolean solveAnagrams(String first, String second ) {
        char[] arr1 = new char[100];
        char[] arr2 = new char[100];
        String a, b;
		
        // 문자열 길이비교
        if(first.length() != second.length()) return false;
        else {
            // 문자열 -> 문자배열
            arr1 = first.toCharArray();
            arr2 = second.toCharArray();

            // 문자배열 정렬
            Arrays.sort(arr1);
            Arrays.sort(arr2);
			
            // 문자배열 -> 문자열
            a = String.valueOf(arr1);
            b = String.valueOf(arr2);
			
            // 문자열 비교
            if(a.equals(b)) {
                return true;
            } else {
                return false;
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numTests = sc.nextInt();

        for (int i = 0; i < numTests; i++) {
            String first = sc.next().toLowerCase();
            String second = sc.next().toLowerCase();

            System.out.println(first + " & " + second + " are " + (solveAnagrams(first, second) ? "anagrams." : "NOT anagrams."));
        }
    }
}

 

※생각정리

 

정해진 형식에 맞춰서 해결해야하는 문제였다.

우선 읽어들인 두 문자열의 길이가 다를경우 비교할 필요가 없이 애너그램을 만들 수 없으므로 False를 리턴했다.

길이가 같은 경우에는 각 문자열을 문자배열에 담아 오름차순으로 정렬했다.

그 후, 오름차순 정렬된 문자배열을 다시 문자열에 담아 equals 비교하였다.

 

여기서 "=="가 아닌 equals를 사용한 이유는 "==" 사용할 경우 문자열 자체만이 아닌 주소값까지 비교를 하여 문자열과 주소값이 모두 같을 경우 True를 리턴한다.

equals경우에는 주소값이 아닌 문자열자체만 비교하여 같을 경우 True를 리턴한다.

 

-새벽코딩-

반응형

'알고리즘' 카테고리의 다른 글

[백준] [1373] 2진수 8진수  (0) 2022.11.25
[백준] [2745] 진법 변환  (2) 2022.11.25
[백준] [1652] 누울 자리를 찾아라  (0) 2022.11.23
[백준] [1159] 농구 게임  (0) 2022.11.23
[백준] [10798] 세로읽기  (0) 2022.11.22
Comments