Study with me/프로그래머스 L0 마스터하기

프로그래머스 - L0 A로B만들기

외계나무 2024. 3. 10. 17:13

코딩테스트 연습 - A로 B 만들기 | 프로그래머스 스쿨 (programmers.co.kr)

간만에 좀 재밌게 풀었다 싶어서 가져와봤다.

class Solution {
    public int solution(String before, String after) {
        int a = 0;
        for(int i=0; i<before.length(); i++) {
            int n = (int)(before.charAt(i));
            a += (n*n);
            int m = (int)(after.charAt(i));
            a -= (m*m);
        }
        return a == 0 ? 1 : 0;
    }
}

대략적으로 문제를 보면, A를 이루는 알파벳 각 함량이 B의 그것과 일치하는지 확인하는 문제다.

일치하면 1, 아니면 0을 반환한다. 조건상 둘 다 소문자로만 이루어져 있고, 길이가 같아서 확인해야 할 예외가 적다.

문자열 변환도 싫고, 리스트나 맵 같은 자료구조도 쓰기 싫어서 아스키코드를 어떻게 활용할 수 없을지 고민했다.

0으로 이루어진 리스트의 인덱스를 -97로 쓰는 방법도 있지만 리스트 쓰기 싫어서 고민하는 거라서 패스,

중간에 '-' 넣어 죽 이어볼까 싶지만 문자열 쓰기 싫어서 222 패스.

글자수가 같으니 before의 각 글자의 아스키 코드 숫자를 더해서 만든 수가 after의 그것과 같으면 되지 않을까 했는데,

그렇다... 1+1+3 == 2+2+1 ... 포기할까 하다가 제곱에 생각이 닿았다.

혹시라도 총합의 수가 정수 범위를 넘어가면 좀 곤란할 뻔 했지만,

영문 소문자의 아스키코드는 a(97) - z(122)로,

주어진 문자열은 최대 1000자라서 모두 z라고 쳐도 122*122*1000이라서 약 20억인 정수 범위 안쪽이다.

(그러다가 각각 수를 만들지 않고 애초에 한 수에 더하고 빼면 된다는 걸 깨닫고 고려할 필요가 없어졌지만)

여튼, 그래서 0으로 초기화한 변수 a에 before과 after의 글자 순서대로 아스키코드의 제곱값을 더하고 뺐다.

작업을 마쳤을 때 a가 다시 0으로 돌아와있으면 before과 after은 알파벳 함량이 일치하는 것이고, 0이 아니면 땡.

헷갈리는 메서드 안 쓰기 + 리스트 같은 자료형 안 쓰기 => 목표 달성! ㅋㅋㅋ