[Codeforces] 1B Spreadsheets 풀이 코드 (C/C++/Java /Python)

by iamtrueline

문제 해설

Difficulty : *1600 (Implementation / Math)

엑셀의 두 가지 컬럼로우 표기 방식을 변환하는 함수를 구현해야 합니다. 첫 번째 방식은 로우를 의미하는 ‘R’과 컬럼을 의미하는 ‘C’ 뒤에 각각 숫자가 이어지는 방식, RnnCnn. 두 번째 방식은 컬럼을 알파벳으로 표기하고 로우는 숫자로 표기하는 CCnn. 입력이 주어지면 먼저 어떤 표기방식인지 판단하고, 다른 표기 방식으로 변경하면 됩니다.

풀이

먼저 입력으로 주어진 문자열이 어떤 표기법인지부터 판별합니다. 첫 번째 글자가 ‘R’이 아니라면 무조건 CCnn입니다. 두 번째 글자가 숫자가 아니어도 CCnn입니다. 만약 첫 번째 글자가 ‘R’이며 두 번째 글자가 숫자인 경우엔 RnnCnn일 경우와 CCnn일 경우 두 가지 다 가능하므로 조건문으로 추가 판별합니다. 두 번째 글자가 숫자였는데 이후 ‘C’가 등장한다면 RnnCnn입니다. 끝까지 숫자라면 CCnn이죠.

CCnn에서 RnnCnn으로 변환하는 함수가 필요합니다. 먼저 알파벳 부분만 배열에 담아두고, 이미 숫자로 전달된 로우를 추출합니다. 이때, 숫자가 문자로 전달됐으므로 ‘0’을 빼서 정수로 변환합니다. 컬럼은 미리 저장한 알파벳을 숫자로 변환하여 추출합니다. 대문자 알파벳 문자에서 ‘A’를 빼고 1을 더하면 알파벳 순서에 따른 정수가 됩니다. 알파벳을 사용한 숫자 표기는 26진법과 같으므로 해당 계산을 유의합니다. 추출을 마치면 RnnCnn 형태로 출력합니다.

RnnCnn에서 CCnn으로 변환하는 함수는 위 함수와 반대 과정입니다. 로우와 컬럼 모두 문자로 표현된 숫자로 전달되었으므로 각각 위치를 찾아 정수 형태로 변환한 후 CCnn 형태로 출력합니다. 문자-숫자 변환과 숫자-문자 변환이 익숙하지 않다면 단계별 출력 값을 확인해보며 진행하시길 추천드립니다.


코드

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void gotocharacter(char* text) {
    // CCnn -> RnnCnn
    int r = 0, c = 0, i = 0, j = 0, num = 0;
    char cha[20];

    for (i = 0; i < strlen(text); i++) {
        if (text[i] >= 'A' && text[i] <= 'Z') {
            cha[i] = text[i];
        }
        else {
            break;
        }
    }
    cha[i] = '\0';

    for (j = i; j < strlen(text); j++) {
        r *= 10;
        r += text[j] - '0';
    }
    for (j = 0; j < strlen(cha);j++) {
        num = cha[j] - 'A' + 1;
        c = c * 26 + num;
    }

    printf("R%dC%d\n", r, c);

    return;
}

void gotonumber(char* text) {
    // RnnCnn -> CCnn
    int c = 0, i = 0, j = 0, k = 0;
    char row[10], col[10];
    char ans[20], tmp[20];

    for (i = 1; i < strlen(text); i++) {
        if (text[i] != 'C') {
            row[j] = text[i];
            j++;
        }
        else {
            break;
        }
    }
    row[j] = '\0';
    j += 2;
    for (i = j; i < strlen(text); i++) {
        col[k] = text[i];
        k++;
    }
    col[k] = '\0';

    for (i = 0; i < strlen(col); i++) {
        c *= 10;
        c += col[i] - '0';
    }
    for (i = 0; c != 0 ;i++) {
        int num = (c - 1) % 26;
        tmp[i] = 'A' + num;
        if (c % 26 != 0) {
            c /= 26;
        }
        else {
            c = c / 26 - 1;
        }
    }
    tmp[i] = '\0';
    k = strlen(tmp) - 1;
    for (j = 0; j <= k; j++) {
        ans[j] = tmp[k - j];
    }

    for (j = 0; j < strlen(row); j++) {
        ans[i + j] = row[j];
    }
    ans[i + j] = '\0';

    printf("%s\n", ans);

    return;
}


int main(){
    int n, i, j;
    char tmp[20];
    scanf("%d", &n);

    for (i = 0; i < n; i++) {

        scanf("%s", tmp);
        if (tmp[0] != 'R') {
            gotocharacter(tmp);
        }
        else {
            if (tmp[1] >= '0' && tmp[1] <= '9') {
                for (j = 2; j < strlen(tmp); j++) {
                    if (tmp[j] == 'C') {
                        gotonumber(tmp);
                        tmp[0] = '\0';
                        break;
                    }
                }
                if (tmp[0] != '\0'){
                    gotocharacter(tmp);
                }
            }
            else {
                gotocharacter(tmp);
            }
        }
        tmp[0] = '\0';
    }

    return 0;
}

C++

#include <iostream>
#include <cstring>
using namespace std;

void gotocharacter(char* text) {
    // CCnn -> RnnCnn
    int r = 0, c = 0, i = 0, num = 0;
    char cha[20];

    for (i = 0; i < strlen(text); i++) {
        if (text[i] >= 'A' && text[i] <= 'Z') {
            cha[i] = text[i];
        }
        else {
            break;
        }
    }
    cha[i] = '\0';

    for (int j = i; j < strlen(text); j++) {
        r *= 10;
        r += text[j] - '0';
    }
    for (int j = 0; j < strlen(cha);j++) {
        num = cha[j] - 'A' + 1;
        c = c * 26 + num;
    }

    cout<<'R'<<r<<'C'<<c<<endl;

    return;
}

void gotonumber(char* text) {
    // RnnCnn -> CCnn
    int c = 0, i = 0, j = 0, k = 0;
    char row[10], col[10];
    char ans[20], tmp[20];

    for (i = 1; i < strlen(text); i++) {
        if (text[i] != 'C') {
            row[j] = text[i];
            j++;
        }
        else {
            break;
        }
    }
    row[j] = '\0';
    j += 2;
    for (i = j; i < strlen(text); i++) {
        col[k] = text[i];
        k++;
    }
    col[k] = '\0';

    for (i = 0; i < strlen(col); i++) {
        c *= 10;
        c += col[i] - '0';
    }
    for (i = 0; c != 0 ;i++) {
        int num = (c - 1) % 26;
        tmp[i] = 'A' + num;
        if (c % 26 != 0) {
            c /= 26;
        }
        else {
            c = c / 26 - 1;
        }
    }
    tmp[i] = '\0';
    k = strlen(tmp) - 1;
    for (j = 0; j <= k; j++) {
        ans[j] = tmp[k - j];
    }

    for (j = 0; j < strlen(row); j++) {
        ans[i + j] = row[j];
    }
    ans[i + j] = '\0';

    cout<<ans<<endl;

    return;
}


int main(){
    int n, i, j;
    char tmp[20];
    cin>>n;

    for (i = 0; i < n; i++) {

        cin>>tmp;
        if (tmp[0] != 'R') {
            gotocharacter(tmp);
        }
        else {
            if (tmp[1] >= '0' && tmp[1] <= '9') {
                for (j = 2; j < strlen(tmp); j++) {
                    if (tmp[j] == 'C') {
                        gotonumber(tmp);
                        tmp[0] = '\0';
                        break;
                    }
                }
                if (tmp[0] != '\0'){
                    gotocharacter(tmp);
                }
            }
            else {
                gotocharacter(tmp);
            }
        }
        tmp[0] = '\0';
    }

    return 0;
}

Java

import java.util.Scanner;

public class Main {
    public static void gotocharacter(String text) {
        // CCnn -> RnnCnn
        int r = 0, c = 0, i = 0, num = 0;
        char[] cha = new char[20];
    
        for (i = 0; i < text.length(); i++) {
            if (text.charAt(i) >= 'A' && text.charAt(i) <= 'Z') {
                cha[i] = text.charAt(i);
            }
            else {
                break;
            }
        }
        int cha_len = i;
    
        for (int j = i; j < text.length(); j++) {
            r *= 10;
            r += text.charAt(j) - '0';
        }
        for (int j = 0; j < cha_len;j++) {
            num = cha[j] - 'A' + 1;
            c = c * 26 + num;
        }
    
        System.out.println("R"+r+"C"+c);
    
        return;
    }
    
    public static void gotonumber(String text) {
        // RnnCnn -> CCnn
        int c = 0, i = 0, j = 0, k = 0;
        char[] row = new char[10];
        char[] col = new char[10];
        char[] ans = new char[20];
        char[] tmp = new char[20];
    
        for (i = 1; i < text.length(); i++) {
            if (text.charAt(i) != 'C') {
                row[j] = text.charAt(i);
                j++;
            }
            else {
                break;
            }
        }
        int row_len = i-1;
        j += 2;
        for (i = j; i < text.length(); i++) {
            col[k] = text.charAt(i);
            k++;
        }
        int col_len = i-j;
        
        for (i = 0; i < col_len; i++) {
            c *= 10;
            c += col[i] - '0';
        }
        for (i = 0; c != 0 ;i++) {
            int num = (c - 1) % 26;
            tmp[i] = (char)('A' + num);
            if (c % 26 != 0) {
                c /= 26;
            }
            else {
                c = c / 26 - 1;
            }
        }
        k = i - 1;
        for (j = 0; j <= k; j++) {
            System.out.print(tmp[k - j]);
            ans[j] = tmp[k - j];
        }
    
        for (j = 0; j < row_len; j++) {
            System.out.print(row[j]);
            ans[i + j] = row[j];
        }
        System.out.println();
    
        return;
    }
    
	public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int flag = 0;
    
        for (int i = 0; i < n; i++) {
            String tmp = sc.next();
            if (tmp.charAt(0) != 'R') {
                gotocharacter(tmp);
            }
            else {
                if (tmp.charAt(1) >= '0' && tmp.charAt(1) <= '9') {
                    for (int j = 2; j < tmp.length(); j++) {
                        if (tmp.charAt(j) == 'C') {
                            gotonumber(tmp);
                            flag = 1;
                            break;
                        }
                    }
                    if (flag != 1){
                        gotocharacter(tmp);
                        flag = 0;
                    }
                }
                else {
                    gotocharacter(tmp);
                }
            }
            flag = 0;
        }
    }
}

Python

def gotocharacter(text):
    # CCnn -> RnnCnn
    r = 0
    c = 0
    i = 0
    num = 0
    cha = []

    for i in range(len(text)):
        if text[i] >= 'A' and text[i] <= 'Z':
            cha.append(text[i])
        else:
            break

    for j in range(i, len(text)):
        r *= 10;
        r += int(text[j])
    for j in range(len(cha)):
        num = int(ord(cha[j]) - ord('A') + 1)
        c = c * 26 + num

    print('R', r, 'C', c, sep="")
    
def gotonumber(text):
    # RnnCnn -> CCnn
    c = 0
    i = 0
    j = 0
    k = 0
    row = []
    col = []
    ans = []
    tmp = []

    for i in range(1, len(text)):
        if text[i] != 'C':
            row.append(text[i])
            j += 1
        else:
            break
    j += 2;
    for i in range(j, len(text)):
        col.append(text[i])
        k += 1

    for i in range(len(col)):
        c *= 10;
        c += int(col[i])
    i = 0
    while c != 0:
        num = (c - 1) % 26
        tmp.append(chr(ord('A') + num))
        if c % 26 != 0:
            c //= 26
        else:
            c = c // 26 - 1
        i += 1
    k = len(tmp) - 1;
    for j in range(k+1):
        ans.append(tmp[k - j])

    for j in range(len(row)):
        ans.append(row[j])

    for i in ans:
        print(i,end="")
    print()

n = int(input())

for i in range(n):
    tmp = input()
    flag = 0
    if tmp[0] != 'R':
        gotocharacter(tmp)
    else:
        if tmp[1] >= '0' and tmp[1] <= '9':
            for j in range(2, len(tmp)):
                if tmp[j] == 'C':
                    gotonumber(tmp)
                    flag = 1
                    break
            if flag != 1:
                gotocharacter(tmp)
                flag = 0
        else:
            gotocharacter(tmp)

문제 출처

https://codeforces.com/contest/1/problem/B

You may also like

Leave a Comment

Are you sure want to unlock this post?
Unlock left : 0
Are you sure want to cancel subscription?
-
00:00
00:00
Update Required Flash plugin
-
00:00
00:00