Code Kata [문자열 다루기 기본, 행렬의 덧셈, 부족한 금액 계산하기, 문자열 내림차순으로 배치하기]
Code Kata
부족한 금액 계산하기, 문자열 내림차순으로 배치하기 : 이 두 문제는 쉬워서 GitHub에만 작성함.
- 부족한 금액 계산하기 | Solved Date: 2026-05-09-Sat | Problem Link
- 문자열 내림차순으로 배치하기 | Solved Date: 2026-05-09-Sat | Problem Link
행렬의 덧셈
037. 행렬의 덧셈| Solved Date: 2026-05-09-Sat | Problem Link
문제 설명
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예
| [1,2],[2,3](https://www.notion.so/1,2],[2,3) | [3,4],[5,6](https://www.notion.so/3,4],[5,6) | [4,6],[7,9](https://www.notion.so/4,6],[7,9) |
| [1],[2](https://www.notion.so/1],[2) | [3],[4](https://www.notion.so/3],[4) | [4],[6](https://www.notion.so/4],[6) |
arr1 arr2 return
기본 코드
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
return answer;
}
힌트
- 다중 배열 [i] [j]
- 대입 해야한다. pushback() 아니다
- vector<vector> answer = arr1; // 초기화
문제 풀이 과정
문제 나누기
- {행렬 A1 + 행렬 B1 , 행렬 A2 + 행렬 B2}
정답 소스 코드
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer = arr1;
for (int i = 0; i < arr1.size(); i++)
{
for (int j = 0; j < arr1[0].size(); j++)
{
answer[i][j] = (arr1[i][j] + arr2[i][j]);
}
}
return answer;
}
Comments:
- 처음에
- 역시 다중 배열은 매번 헷갈린다*
- 초기화 안하면 컴파일 에러생김. vector<vector> answer = arr1; // arr1과 같은 크기의 결과 행렬(answer)을 초기화
아래는 vscode에서 main 세팅해서 테스팅할때 사용한거
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer = arr1;
for (int i = 0; i < arr1.size(); i++)
{
for (int j = 0; j < arr1[0].size(); j++)
{
answer[i][j] = (arr1[i][j] + arr2[i][j]);
}
}
return answer;
}
int main()
{
vector<int> arrA1{ 1,2 };
vector<int> arrA2{ 2,3 };
vector<vector<int>> arr1{ arrA1,arrA2};
vector<int> arrB1{ 3,4 };
vector<int> arrB2{ 5,6 };
vector<vector<int>> arr2{ arrB1,arrB2 };
//cout << "A1: " << arrA1[0] << endl;
//cout << "arr1: " << arr1[0][0] << endl;
//cout << "ar2: " << arr2[0][0] << endl;
solution(arr1,arr2);
return 0;
}
문자열 다루기 기본
036. 문자열 다루기 기본 | Solved Date: 2026-05-09-Sat | Problem Link
문제 설명
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
제한 사항
- s는 길이 1 이상, 길이 8 이하인 문자열입니다.
- s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예
| "a234" | false |
| "1234" | true |
s return
기본 코드
#include <string>
#include <vector>
using namespace std;
bool solution(string s) {
bool answer = true;
return answer;
}
힌트
- #include <cctype>
- isdigit()
- 문자열 s의 길이가 4 혹은 6
정답 소스 코드
#include <string>
#include <vector>
#include <cctype>
using namespace std;
bool solution(string s) {
if (s.length() != 4 && s.length() != 6)
{
return false;
}
for (int i = 0; i < s.length(); i++)
{
if (!isdigit(s[i])) {
return false;
}
}
return true;
}
Comments:
이번문제는 문자열로 변형 하는 법 몰라서 그냥 바로 검색해서 찾아봄
- 처음에 stoi 가 맞는 줄 알았는데 문제가, stoi 는 중간이나 뒤쪽에 문자열이 들어갈경우 제대로된 답이 안나옴
- 결국 #include<cctype> 안에 있는 isdigit() 을 사용하는 게 맞았다.
- 또한 '문자열 s의 길이가 4 혹은 6' 를 검사 안하고 그냥하니 역시 오류뜸. 어떨때는 저런 자세한 사항을 안맞춰도 될때가 있어서 귀찮으니깐 스킵할 때가 있는데 앞으로 조심자.
isdigit()
C++의 isdigit()은 문자가 10진수 숫자('0'-'9')인지 판별하는 함수로, <cctype> 헤더에 정의되어 있습니다. 숫자인 경우 0이 아닌 값(true)을, 아니면 0(false)을 반환하며, 주로 문자열 내 숫자 검사나 입력 데이터 검증에 활용됩니다
- 헤더: #include <cctype>
- 함수 원형: int isdigit(int c);
- 기능: 매개변수로 전달된 문자가 '0'부터 '9' 사이의 숫자인지 확인
- 반환값:
- 0이 아닌 값 (True): 문자가 숫자('0'-'9')일 때
- 0 (False): 문자가 숫자가 아닐 때
- 특징: 아스키 코드 값 기준으로 '0' (48) ~ '9' (57)를 판별
주의사항 및 팁
- 매개변수: char 타입을 전달해도 되지만, 함수 원형은 int 타입을 받습니다.
- 문자열 검사: isdigit()은 문자 하나(char)만 검사합니다. 문자열(std::string) 전체를 검사하려면 루프(for, while)를 사용하여 각 문자를 검사해야 합니다.
- 범위: 오직 10진수 숫자 '0'-'9'만 true를 반환함함
아래는 stoi 찾아보면서 나온 정보.
If-Else vs Try-catch
- 여기서 if else 는 오류 상황에서 실행이 안되기 때문에 try-catch 사용해야 한다
- C++에서 if-else는 정상 흐름 내에서 조건을 검사하여 분기하는 논리 제어문이고, try-catch는 예외적인 상황(오류)을 처리하여 프로그램의 비정상 종료를 막는 예외 처리 구조다. if-else는 일반적인 상황에, try-catch는 예외(Exception) 발생 시 사용.
try {
// 예외가 발생할 가능성이 있는 코드
if (/* 오류 상황 */) {
throw /* 예외 객체/값 */; // 예외 발생 시 catch로 점프
}
} catch (/* 예외 자료형 */ e) {
// 예외 처리 코드
}
핵심 차이점 요약
- 용도: if-else는 일반적인 조건 분기(예: 짝수/홀수), try-catch는 파일 미존재, 메모리 부족 등 비정상 상황 처리.
- 작동 방식: try-catch는 예외 발생 시 즉시 코드 블록을 종료하고 catch로 제어 이동. if-else는 해당 블록만 수행.
- 성능: if-else가 일반적으로 try-catch보다 빠르며, try-catch는 예외 발생 시 성능 저하가 발생할 수 있습니다.
- 스코프(Scope): try 블록 내에서 선언된 변수는 catch에서 접근할 수 없습니다.
stoi
- std::stoi: String to int
- std::stol: String to long
- std::stoll: String to long long
- std::stoul: String to unsigned long
- std::stof: String to float
- std::stod: String to double
잘못된 사용
#include <string>
#include <vector>
using namespace std;
bool solution(string s)
{
try {
stoi(s);
} catch (...) {
return false;
}
return true;
}
틀린 이유
- stoi("1234"): (1234) 로 변환 성공.
- stoi("123a"): 앞의 123만 숫자로 변환하고 나머지를 무시하여 (123)으로 변환 성공. (이것이 예외를 발생시키지 않아 try-catch에서 걸러지지 않습니다.)
- stoi("a123"): 첫 글자가 숫자가 아니므로 예외 발생.
- 제한 사항: 문자열은 영문 알파벳을 포함할 수 있으므로, "123a" 같은 케이스는 숫자로만 구성되어야 한다는 조건을 만족하지 않습니다
