항해99 코테

99클럽 코테 스터디 8일차 TIL + Check if Number Has Equal Digit Count and Digit Value(LeetCode 2283번)

탱도시락 2025. 4. 9. 13:57

✅ 오늘의 학습 키워드

- 문자 → 정수 변환

이번엔 99 클럽 코테 스터디의 비기너 문제를 먼저 풀어보았다. 이 문제는 문자열의 각 위치와 그 위치에 있는 숫자 값 사이의 특별한 관계를 확인하는 것이었다.
(문제 링크 : https://leetcode.com/problems/check-if-number-has-equal-digit-count-and-digit-value/)


공부한 내용

문제 요약

  • 0부터 시작하는 인덱스 숫자로 구성된 문자열 num이 주어짐
  • 각 위치 i에 있는 숫자가 문자열 내에서 숫자 i가 나타나는 횟수와 일치하는지 확인
  • 모든 위치에서 이 조건이 충족되면 true, 아니면 false 반환

풀이 로직

1. 문자열의 각 인덱스 i에 대해 반복문을 실행한다.

2. 각 인덱스 i에 대해:

  • 숫자 i가 문자열 전체에서 몇 번 나타나는지 카운팅(cnt).
  • 이를 위해 두 번째 반복문(j)을 사용하여 문자열을 다시 순회한다.
  • num[j]가 숫자 i와 같은지 확인하고, 같다면 카운팅(cnt)를 증가시킨다.

3. 카운팅(cnt)이 끝나면, i번째 위치에 있는 숫자(num[i])가 세어진 카운팅(cnt)와 일치하는지 확인한다.

  • 일치하지 않으면, false를 반환.
  • 모든 위치에서 일치하면, true를 반환.

✅ 오늘의 회고

- 😳 어떤 문제가 있었고, 나는 어떤 시도를 했는지

처음에는 문제 이해가 쉽지 않았다.(영어..크흠..)

"숫자 i가 num[i]번 나타나야 한다" 라는 조건이 직관적으로 이해가 되지 않았다. 그리고 현재 숫자가 문자이기 때문에 이것을 숫자로도 바꿔야 하는 방법을 몰랐다. 

- 🤔 어떻게 해결했는지

문자를 정수로 바꾸는 방법을 찾아보았고 

문자를 정수로 변환할 때는 num [j] - '0' 방식을 활용해야 한다는 것을 알았다. 이는 문자의 ASCII 값 차이를 이용한 간단한 변환 방법이다.

(참고: https://velog.io/@haminggu/ASCII-%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C-%ED%91%9C%ED%98%84%EB%90%9C-%EC%88%AB%EC%9E%90%EB%A5%BC-%EC%A0%95%EC%88%98%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%A0-%EB%95%8C)

- 🤩 무엇을 새롭게 알았는지

1. 문자-숫자 변환: C++에서 문자를 숫자로 변환하는 간단한 방법은 해당 문자에서 '0'을 빼는 것이다. 이는 ASCII 코드 값의 차이를 이용한 것이다. stoi() 함수도 사용할 수있는데 ASCII코드 사용보다는 메모리 효율성이 떨어지지 않을까 싶다.


전체 코드

class Solution {
public:
    bool digitCount(string num) {

        for (int i = 0; i < num.size(); i++) {
            int cnt = 0;

            // 문자열에서 숫자 i가 나타나는 횟수 세기
            for(int j = 0; j < num.size(); j++){
                if(num[j] - '0' == i) { // 문자 -> 정수로 변환하려면 해당 문자에서 '0'을 빼면 됨.
                    cnt++;
                }
            }

            // 현재 위치의 숫자와 카운트 비교
            if (num[i] - '0' != cnt) {
                return false;
            }
        }

        return true;
    }
};