새소식

⌨️ Algorithms/백준

[Python] 백준 2757번_엑셀

2023. 3. 19. 23:16

  • -

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

 

2757번: 엑셀

입력은 여러 줄이며, RnCm형태이다. n은 행 번호 (1<=n<=300000000), m은 열 번호 (1<=m<=300000000) 이다. 입력의 마지막은 n과 m이 모두 0이며, 이때는 출력하지 않고 프로그램을 종료하면 된다.

www.acmicpc.net

 

  • 엑셀의 첫 번째 열은 A이고, 두 번째 열은 B이고, 26번째 열은 Z
  • 26번째 열 다음 열부터는 2글자를 이용
  • 예를 들어, 27번째 열은 AA이고, 28번째 열은 AB, 52번째 열은 AZ, 53번째 열은 BA이며, 이와 같이 계속 열의 이름을 붙임
  • ZZ열 다음 열은 AAA가 되고, 그 다음은 AAB
  • 엑셀에서 행은 그냥 행 번호를 사용하면 됨
  • 엑셀 스프레드시트에서 각 칸은 위에서 설명한 열과 행을 합쳐서 이름을 만들 수 있음
  • 가장 왼쪽 위에 있는 칸은 A1이 되고, 55열 23행에 있는 칸은 BC23
  • 열과 행이 주어졌을 때, 그 칸의 엑셀 스프레드시트 상에서 이름을 출력
  • 입력
    • 입력은 여러 줄이며, RnCm형태
    • n은 행 번호 (1<=n<=300000000), m은 열 번호 (1<=m<=300000000)
    • 입력의 마지막은 n과 m이 모두 0이며, 이때는 출력하지 않고 프로그램을 종료
  • 출력
    • 각 입력을 순서대로 한 줄에 하나씩 엑셀 스프레드시트 상에서의 이름을 출력
  • 시간 제한: 1초
  • 메모리 제한: 128 MB

 

"""
입출력 예시)

R1C1
R3C1
R1C3
R299999999C26
R52C52
R53C17576
R53C17602
R0C0
            -> A1
               A3
               C1
               Z299999999
               AZ52
               YYZ53
               YZZ53
"""

 

 

## 의사코드 ##

# 입력: RnCm 
# n, m = map(int, input()[1:].split('C'))

# 자릿수의 값 = 열의 값을 26으로 나눈 나머지
# 자릿수의 값 = m % 26 

# 다음 자릿수 = 기존 열의 값을 26으로 나눈 몫 -1
# m = (m // 26) - 1

# 리스트의 0번째 인덱스에 자릿수의 값 삽입
# li.insert(0, 자릿수의 값)

# A-Z 대문자 리스트
# from string import ascii_uppercase
# list(ascii_uppercase)

# 엑셀 스프레드시트 상에서의 열
#      = 리스트에 저장된 자릿수의 값을 대문자 리스트의 인덱스 값으로 넣어서 문자로 변환 

# 열 + 행
# print(열 + str(n))

 

 

 

 

from string import ascii_uppercase

while True:
    n, m = map(int, input()[1:].split('C'))
    if n == 0 and m == 0:
        break 
    else:
        m -= 1
        # A-Z 대문자 리스트
        alpha = list(ascii_uppercase)
        # 열에 해당하는 값을 저장할 리스트 
        li = []
        while m >= 0:
            # 자릿수의 값 = 열의 값을 26으로 나눈 나머지
            col = m % 26 
            # 다음 자릿수 = 기존 열의 값을 26으로 나눈 몫 -1
            m = (m // 26) - 1
            # 리스트의 0번째 인덱스에 자릿수의 값 삽입
            li.insert(0, col)

        res = '' 
        # 리스트에 저장된 자릿수의 값을 대문자 리스트의 인덱스 값으로 넣어 문자로 변환 
        for c in li:
            res += alpha[c]
        # 열 + 행
        print(res + str(n))

 

 

  • 과정 확인
'R52C52'

"""
n: 52, m: 52 

m-1: 51
m % 26: 25
(m // 26) - 1: 0
li: [25] 

m % 26: 0
(m // 26) - 1: -1
li: [0, 25] 

c: 0
alpha[c]: A
res: A 

c: 25
alpha[c]: Z
res: AZ 

AZ52
"""

 

 

 

 

https://docs.python.org/ko/3/library/string.html

 

string — Common string operations

Source code: Lib/string.py String constants: The constants defined in this module are: Custom String Formatting: The built-in string class provides the ability to do complex variable substitutions ...

docs.python.org

 

https://lngnat.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EA%B0%92-%EC%B6%94%EA%B0%80-append-insert-extend-%EC%82%AC%EC%9A%A9

 

파이썬 리스트 값 추가하기 append insert extend 사용하기

파이썬 리스트를 다루다보면 값을 추가해야 할 일이 생길 수 있다. 값을 넣는 함수는 append함수와 insert함수가 있으며 extend함수를 사용할 경우 기존의 리스트 내용에 다른 리스트의 내용을 추가

lngnat.tistory.com

 

https://velog.io/@jaehyukjung/%EB%B0%B1%EC%A4%80-2757%EB%B2%88-%ED%8C%8C%EC%9D%B4%EC%8D%AC

 

백준 2757번 파이썬

해당 문제는 엑셀을 예시로 하는 문제로 행과 열의 순번이 주어졌을 때, 열의 경우 알파벳을 기준으로 나뉘는 것을 알 수 있다. 알파벳을 자리수라고 한다면 이를 26진법 수라고 생각하는게 쉬울

velog.io

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!