ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BOJ 8595 히든넘버
    코딩테스트/백준 2025. 2. 3. 19:22

    https://www.acmicpc.net/problem/8595

    요구사항

    • 시간 제한 1초
    • 공간 제한 256MB
    • 히든 넘버의 합을 구할 것.
    • 문자는 알파벳 대소문자와 숫자(0-9)로 이루어져 있음. 
    • 두 히든 넘버 사이에는 글자가 적어도 한 개 있다.
    • 연속된 숫자는 한 히든 넘버이다.

    결론: 단어의 길이가 5,000,000이므로 O(N**2) 안 쪽으로 구현해야 한다. 

     

    설계

    • ord() 메서드를 사용한다. 알파벳 대소문자는 65-122 사이 존재 
      • print(ord('a')) 를 통해 확인 가능
      • 그 이유는 문자열을 for문으로 순회하면서 확인
      • 65-122 범위 밖이라면 num_list에 넣는다.
      • 그 외 범위라면 num_list 에 저장된 하나 하나의 문자를 합치고 기존과 더한다.
      • 예를 들어 num_list = ['1', '2'] 들어가 있다면 sum += int(''.join(num_list))

    위 논리대로 구현 but 실패

    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    # 단어의 길이
    how_many_nums = int(input())
    
    num_list = []
    
    # 단어 입력
    sentence = input()
    
    # 총합
    sum = 0
    
    for find_num in sentence:
        if 65<= ord(find_num) <= 122:
            sum += int(''.join(num_list))
            num_list.clear() # 더한 숫자는 더 이상 필요 없다.
        # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다.
        else:
            num_list.append(find_num)
    
    print(sum)

    • 디버깅해본 결과 ValueError 발생 원인은 num_list =[] 비어있을 때. 
    for find_num in sentence:
        print("find_num : ", find_num)
    
        if (65<= ord(find_num) <= 122) and (num_list):
            print("num_list : ",num_list)
            sum += int(''.join(num_list))
            print("sum : ", sum)
            num_list.clear()
        # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다.
        else:
            num_list.append(find_num)
    • 위와 같이 했더니 아직도 오류가 있다. 예를 들어 a1b 문자열을 입력했을 때, a도 num_list에 들어가기 때문이다.
    for find_num in sentence:
        print("find_num : ", find_num)
    
        if 65<= ord(find_num) <= 122:
            print("num_list : ",num_list)
            if(num_list):
                sum += int(''.join(num_list))
                print("sum : ", sum)
            num_list.clear()
        # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다.
        else:
            num_list.append(find_num)
            print("num_list2: ", num_list)
    • and num_list를 아래로 빼주어 해결
    • 하지만 여전히 a1b12 로 했을 때, 원하는 출력값이 나오지 않음. 출력결과 1이 나옴. 왤까?
    • 현재 더하는 로직은 알파벳이 나왔을 때만 한다. 따라서 마지막에 한 번 더 더하는 로직을 처리해주면 어떨까?
      • 두 히든 넘버 사이에는 적어도 하나의 글자가 존재함. 1a1 이렇듯 마지막에 숫자가 존재할 수 있음.

    구현

    # 대문자 A는 65 소문자 a 는 97 z는 122
    # 65~122 사이의 수는 알파벳 대소문자이다.
    # for문을 돌면서 문자를 담아두고 만약 65 -122 사이의 숫자가 나오면 리스트를 정수로 바꾸고 더하자
    # print(ord('a'))
    
    import sys
    input = lambda: sys.stdin.readline().rstrip()
    
    # 단어의 길이
    how_many_nums = int(input())
    
    num_list = []
    # print(int(''.join(num_list)) + 1)
    
    # 단어 입력
    sentence = input()
    #print("sentence : ",sentence)
    
    # 총합
    sum = 0
    
    for find_num in sentence:
        #print("find_num : ", find_num)
    
        if 65<= ord(find_num) <= 122:
            #print("num_list : ",num_list)
            if(num_list):
                sum += int(''.join(num_list))
                #print("sum : ", sum)
            num_list.clear()
        # else로 한 이유 단어는 알파벳 대/소문자와 숫자로 이루어져 있음. 특수 문자는 없다.
        else:
            num_list.append(find_num)
            #print("num_list2: ", num_list)
    
    if num_list:
        sum += int(''.join(num_list))
    print(sum)

    헷갈렸던 부분 정리

    join() 은 리스트나 튜플 같은 반복 가능한(iterable) 객체의 요소들을 하나의 문자열로 합칠 때 사용

    separator.join(iterable)

     

    리스트 지우기 num_list.clear() 이건 사실상 쓸 일이 거의 없어서 몰랐다. 

     

    회고

    문제,디버깅 그리고 블로그 작성하는 데 총 48분걸렸다. 분발하자. (아래 제외)

    그 동안 백준 허브가 작동을 안했다니..

     

    Chat gpt 풀이 1

    import sys
    import re
    
    # 입력 받기
    input_string = sys.stdin.readline().strip()
    
    # 정규 표현식으로 숫자 추출
    numbers = re.findall(r'\d+', input_string)
    
    # 정수 변환 후 합 계산
    result = sum(map(int, numbers))
    
    # 결과 출력
    print(result)

     

    Chat gpt 가 알려준 isdigit() + 내가 조금 수정 

    import sys
    
    # 입력 받기
    input_string = sys.stdin.read().strip()
    
    total_sum = 0  # 숫자의 합을 저장할 변수
    current_number = ""  # 연속된 숫자를 저장할 변수
    
    for char in input_string:
        if char.isdigit():
            current_number += char  # 숫자라면 문자열에 추가
        else:
            if current_number:  # 연속된 숫자가 있다면 정수로 변환 후 합산
                total_sum += int(current_number)
                current_number = ""  # 초기화
    
    # 마지막 숫자가 있을 경우 처리
    if current_number:
        total_sum += int(current_number)
    
    print(total_sum)
    • 사실상이건 ord() 하는 것과 별 다를 게 없다.
    • 하지만 좀 더 쉽게 문자열안에 숫자를 판변하기엔 쉬워보인다. 그 외 활용

    '코딩테스트 > 백준' 카테고리의 다른 글

    [Python] BOJ 11728 배열 합치기  (0) 2025.02.06
    [Python] BOJ 1269 대칭차집합  (0) 2025.02.06
    [Python] BOJ 28278 스택 2  (0) 2025.02.02
    [Python] BOJ 7562: 나이트의 이동  (1) 2024.11.27
    [Python] BOJ 9935: 문자열 폭발  (1) 2024.11.20
Designed by Tistory.