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 |