[백준] (실패) 2757 엑셀

Hyun·2025년 3월 9일
0

백준

목록 보기
85/92
post-thumbnail

문제

엑셀의 첫 번째 열은 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

R1C1
R3C1
R1C3
R299999999C26
R52C52
R53C17576
R53C17602
R0C0

예제 출력 1

A1
A3
C1
Z299999999
AZ52
YYZ53
YZZ53

문제 풀이

문제 풀이 방법이 생각나지 않아 1시간 넘게 고민했다가 안풀려서 타 풀이를 참고하였다.
진법 문제라고 생각은 했지만, A-Z 가 1-27에 대응되다 보니, 나머지가 0일 경우에 어떻게 처리해야 하는지가 떠오르지 않았다.

이를 해결하기 위해서는 26으로 나눈 나머지가 0일 경우 몫에서 -1 을 하고, 나머지를 26으로 만들어주면 된다. 이렇게 하면 나머지가 26이 되므로 Z에 대응시킬 수 있다.

그외에 나머지가 0이 아닌 경우(1-25)는 그대로 1-25 -> A-Y 에 대응해주면 된다.

풀이
딕셔너리와 index 함수가 사용되었다.

num_to_alpha = {i: chr(64+i) for i in range(1, 27)}

while True:
    ans = [] 
    cell = input()
    n, m = int(cell[1:cell.index('C')]), int(cell[cell.index('C')+1:])
    if n == 0 and m == 0 : 
        break

    while m > 0:
        mok = m // 26
        na = m % 26

        if na == 0:
            mok -= 1
            ans.append(num_to_alpha.get(26))
        else:
            ans.append(num_to_alpha.get(na))
        m = mok
    print(''.join(reversed(ans)) + str(n))
profile
better than yesterday

0개의 댓글

관련 채용 정보