알고리즘 공부/Cos Pro 문제풀이

COS PRO [1차] 문제2) 해밍 거리 구하기 - JAVA

송테이토 2022. 11. 25. 23:32

※ 프로그램 빈 칸 채우기 문제

□ 문제설명

해밍 거리(Hamming distance)란 같은 길이를 가진 두 개의 문자열에서 같은 위치에 있지만 서로 다른 문자의 개수를 뜻합니다. 예를 들어 두 2진수 문자열이 "10010"과 "110"이라면, 먼저 두 문자열의 자릿수를 맞추기 위해 "110"의 앞에 0 두개를 채워 "00110"으로 만들어 줍니다. 두 2진수 문자열은 첫 번째와 세 번째 문자가 서로 다르므로 해밍 거리는 2입니다.

  • 1001 0
  • 0011 0

두 2진수 문자열 binaryA, binaryB의 해밍 거리를 구하려 합니다. 이를 위해 다음과 같이 간단히 프로그램 구조를 작성했습니다

1단계. 길이가 더 긴 2진수 문자열의 길이를 구합니다.2단계. 첫 번째 2진수 문자열의 길이가 더 짧다면 문자열의 앞에 0을 채워넣어 길이를 맞춰줍니다.3단계. 두 번째 2진수 문자열의 길이가 더 짧다면 문자열의 앞에 0을 채워넣어 길이를 맞춰줍니다.4단계. 길이가 같은 두 2진수 문자열의 해밍 거리를 구합니다.

두 2진수 문자열 binaryA와 binaryB가 매개변수로 주어질 때, 두 2진수의 해밍 거리를 return 하도록 solution 메소드를 작성했습니다. 이때, 위 구조를 참고하여 중복되는 부분은 func_a라는 메소드로 작성했습니다. 코드가 올바르게 동작할 수 있도록 빈칸을 알맞게 채워 전체 코드를 완성해주세요.


□ 매개변수 설명

두 2진수 문자열 binaryA와 binaryB가 solution 함수의 매개변수로 주어집니다.

  • binaryA의 길이는 1 이상 10 이하입니다.
  • binaryA는 0 또는 1로만 이루어진 문자열이며, 0으로 시작하지 않습니다.
  • binaryB의 길이는 1 이상 10 이하입니다.
  • binaryB는 0 또는 1로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

□ return 값 설명

두 2진수 문자열의 해밍 거리를 return 해주세요.


□ 예시

binaryA binaryB return

"10010" "110" 2

□ 예시설명

두 2진수의 자릿수는 각각 5와 3입니다. 자릿수를 맞추기 위해 "110" 앞에 0 두 개를 채워주면 "00110"이 됩니다. 이제 두 2진수 문자열의 해밍 거리를 구하면 다음과 같습니다.

  • 1001 0
  • 0011 0

위와 같이 첫 번째와 세 번째 문자가 서로 다르므로, 해밍 거리는 2가 됩니다.


해석

여기서 해밍거리란??

문자열의 전송 도중 몇 글자에서 오류가 났나를 측정하는 방법 중 하나이다.

  • '1011101'과 '1001001'사이의 해밍 거리는 2이다. (1011101, 10101) -> 0 0
  • '2143896'과 '2233796'사이의 해밍 거리는 3이다. (2143896, 2396) -> 3 7 2
  • "toned"와 "roses"사이의 해밍 거리는 3이다. (toned, oe) s s r
// 다음과 같이 import를 사용할 수 있습니다.
import java.util.*;

class Main {
    public String func_a(String str, int len){
        String padZero = "";
        int padSize = str.length(); // 받은 문자열의 총 길이만큼 0을 추가해줘야한다.
        for(int i = 0; i < padSize; i++)
            padZero += "0";
        return padZero + str;
    }
    
    public int solution(String binaryA, String binaryB) {
        int maxLength = Math.max(binaryA.length(), binaryB.length());
        if(maxLength > binaryA.length())
            binaryA = func_a(binaryA, maxLength);
        if(maxLength > binaryB.length())
            binaryB = func_a(binaryB, maxLength);
        
        int hammingDistance = 0;
        for(int i = 0; i < maxLength; i++)
            if(binaryA.charAt(i)!=binaryB.charAt(i)) //A와 B의 문자를 비교해서 다르면 카운트 1더해줘야하므로 charAt로 구현하였다.
                hammingDistance += 1;
        return hammingDistance;
    }
    
    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
    public static void main(String[] args) {
        Main sol = new Main();
        String binaryA = "10010";
        String binaryB = "110";
        int ret = sol.solution(binaryA, binaryB);
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret + " 입니다.");
    }
}