2037

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

// 누르는 횟수와 현재 버튼 바꾸는 함수
void changeBtn(char *push_btn, char *cur_btn,char change){
    switch (*push_btn){
        case 1:
            (*cur_btn)--;
            *push_btn = change;
            break;
        default:
            (*push_btn) --;
        }
}
int main(void){
    int p,w;
    char str[1000]={0};
    // 누르는 시간, 연속된 번호 누르는 시간 입력 
    scanf("%d %d", &p, &w);
    getchar(); // 버퍼 비우기 \n 없애기
    // 문자열 입력
    gets(str);

    int time = 0;
    char pre_btn = 0;
    int len = strlen(str);
    for(int i = 0; i < len; i++){
        // 공백이면 한번만 누르고 전 버튼 초기화
        if(str[i] == 32){
            time += 1 * p;
            pre_btn =0;
        }
        // 공백이 아닐 경우
        else{
            char push_btn = (str[i]-59)%3+1; // 몇 번 눌렀는지 
            char cur_btn = (str[i]-59)/3;    // 현재 버튼 

            // 7,8,9번의 경우 경우가 다름
            if(cur_btn > 6){
                // 7 = {P,Q,R,S}, 8 = {T,U,V}, 9 = {W,X,Y,Z}
                if(cur_btn == 8){
                    changeBtn(&push_btn, &cur_btn, 4);
                }
                else if(cur_btn == 9){
                    changeBtn(&push_btn, &cur_btn, 3);
                }
                else if(cur_btn == 10){
                    cur_btn--;
                    push_btn += 2;
                }
            }
            
            // 전의 버튼이 현재 버튼이랑 같을 경우
            if(pre_btn == cur_btn){
                time += w;
            }
            
            // 버튼 누르는 시간 추가
            time += push_btn * p;

            // 전의 버튼에 현재 버튼넣기
            pre_btn = cur_btn;
        }
        
    }

    // 시간 출력
    printf("%d", time);
    return 0;
}

아니 진짜 부캠 C언어 기초 강의 너무 잘가르쳐주셔서 포인터 좀 많이 이해함!!ㅎㅎ

 

오늘 백준 문제 좀 쉽게 봤었는데, 7,8,9번은 4 3 4여서 좀 코드가 더러워졌음
그래서 계속 고민함 가독성이 좋은 코드가 좋은건데, 내 코드 처럼 만들면 가독성 부분에서도 떨어지고 7,8,9번을 따로 처리해주는것도 코드적인 부분에서 너무 안좋을 것 같음....

 

근데 시간 없어서 걍 진행시켜했지만,,

만약 프로젝트고 일이라면, 이렇게 안짜고 그냥 (ch >= 'A' && ch <= 'C') 이렇게 처리하거나 배열로 {'','ABC','DEF',...} 이런식으로 처리할거 같긴 함 가독성을 위해서..

 

근데 저걸 쓰기 싫었던게 1번째 방법은 코드가 길어지는게 싫었고, 2번째 방법은 반복문을 한 번더 안에 넣는게 좀 싫었음 ㅎ....

좋은 코드가 뭔지 진짜 어려운 것 같음.ㅜㅜㅜㅜ

 

아 그리고 오늘 백준 질문 게시판 보다가 다른분 티스토리 봤는데 

https://djm03178.tistory.com/8

 

반복문의 조건문 안에 strlen을 넣지 마세요.

C/C++에서 strlen은 char의 연속으로 이루어진 기초적인 형태의 문자열의 길이를 구해주는 역할을 합니다. 문자열의 구조를 몰라도 strlen만 있으면 손쉽게 길이를 알 수 있으니 참으로 편리한 함수이

djm03178.tistory.com

 

이거 보고 생각도 못했음 많이 배웠으묭!! 

그래서 이제부턴 반복문의 조건문 안에 strlen 안넣을 예정!! 

 

'백준' 카테고리의 다른 글

[ 백준 / C ] 6810번 : ISBN  (0) 2025.10.27
[ 백준 / C ] 1475번 : 방 번호  (0) 2025.10.24
[ 백준 / C ] 1233번 : 주사위  (0) 2025.10.22
[ 백준 / C ] 5102번 : Sarah's Toys  (0) 2025.10.21
[ 백준 / C ] 2742번 : 기찍 N  (0) 2025.10.20

+ Recent posts