본문 바로가기

Problem Solving77

[C++] [백준 10757] 큰 수 A+B (pps 4-2) 문제 풀기 전 생각 : /* 우선 string 변수에 숫자 두개를 저장한다. 두 숫자가 길이가 다를수 있으니 더 짧은 숫자 앞에 '0'들을 추가해 길이를 맞춰준다. 그리고 두 숫자를 더할때 overflow가 발생할 수 있으니 두 숫자 모두 앞에 '0'을 더한다. 그리고 맨 뒤에서부터 a+b+overflow 를 한다. a는 첫번째 숫자의 i번째 char이다. b는 두번째 숫자의 i번째 char이다. 만약 오버플로우가 발생하면 overflow라는 변수에 1을 넣고 a+b+overflow-10+'0'을 tmp변수에 넣는다. 발생하지 않으면 0을 넣고 a+b+overflow+'0'를 tmp변수에 넣는다. 그렇게 모든 작업이 끝난후 tmp변수를 리버스 시킨다. 리버스 후 tmp 변수의 첫번째 char가 '0'이라.. 2021. 7. 17.
[C++] [백준 2953] 나는 요리사다 (pps 4-1) 문제 풀기 전 생각 : /* 참가자들의 점수는 총 다섯줄에 걸쳐서 다섯번 입력된다. 우리는 가장 높은 점수를 받은 참가자의 번호와 점수의 합을 저장했다 출력하면 된다. 반복문으로 입력을 받을때마다 판별하면 된다. 간단한 문제이다. */ #include using namespace std; int main() { int n,sum=0,max=0,max_i=0; for(int i=0 ; i n; sum += n; } if(sum > max) { max = sum; max_i = i+1; } } cout 2021. 7. 17.
[C++] [백준 15947] 아기 석환 뚜루루 뚜루 (pps 3-9) 문제 풀기 전 생각 : /* 먼저 기본 가사를 14단어로 쪼개서 입력 받은 숫자를 14로 나눈 값으로 여러가지 케이스를 나눴습니다 그리고 tururu 와 turu 에 해당하는 케이스들은 ru 가 5개보다 적은 케이스들은 직접 조건문으로 출력하고 만약 5개이거나 더 많으면 n/14 + 2 와 n/14 + 1 로 표현했다 */ #include using namespace std; int main() { int n; cin >> n; if( n%14 == 1 || n%14 == 13) cout 2021. 7. 16.
[C++] [LeetCode 38] Count and Say (ops 3-8) 문제 풀기 전 생각 : /* 문제 이해가 잘 되지 않았다 그래서 여기저기 한국어로 해석된 문제를 찾아봤다. 인터넷에서도 정보가 없어서 그들의 코드를 보고 문제의도를 겨우 이해했다 문제 설명을 좀 잘해놓았으면 좋겠다. */ class Solution { public: string countAndSay(int n) { if(n == 1) return "1"; string temp = countAndSay(n-1); string ans = ""; int cnt = 1,i; for(i=1;i 2021. 7. 16.
[C++] [LeetCode 860] Lemonade Change (pps 3-7) 문제 풀기 전 생각 : /* 먼저 동전이 입력되었을 때 5코인이 지불되었다면 가능한 경우의 수는 5코인이 하나 증가하는 것 뿐이다. 10 코인이 지불 되었다면 가능한 경우의 수는 10코인이 하나 증가하고 5코인이 하나 감소하는 것이다. 만약 5코인을 하나 감소시킨 뒤 5코인이 0보다 작으면 false 를 리턴한다. 20 코인이 지불 되었다면 가능한 경우의 수는 10코인이 하나 감소하고 5코인이 하나 감소하거나 5코인이 세개 감소하는 것이다 만약 두가지 경우 모두 5코인과 10코인의 수가 부족하다면 false를 리턴한다. 그리고 만약 모든 작업이 리턴이 되지 않고 정상적으로 끝났다면 true를 리턴한다. */ class Solution { public: bool lemonadeChange(vector& b.. 2021. 7. 16.
[C++] [백준 17211] 좋은 날 싫은 날 (pps 3-5) 문제 풀기 전 생각 : /* 0) (기분 좋은 날) 다음날 기분 좋을 확률 1) (기분 좋은 날) 다음날 기분 안 좋을 확률 2) (기분 안 좋은 날) 다음날 기분 좋을 확률 3) (기분 안 좋은 날) 다음날 기분 안 좋을 확률 N일째에 기분이 좋을 확률은 : N-1 일째가 기분 좋은 날 일수도 있고 안 좋은 날 일수도 있다. 따라서 두 가지 경우의 확률 모두 더해야 N일째 기분이 좋을 확률이다. N일째에 기분이 안 좋을 확률 또한 위와 같다. 두 가지 경우 모두 고려해야 한다. 따라서 tmp1 = h*m[0] + s*m[2]; tmp2 = s*m[3] + h*m[1]; h = tmp1; s = tmp2; 로 반복한다면 기분 좋을 확률과 기분이 안 좋을 확률을 구할 수 있다. */ #include #in.. 2021. 7. 13.
[C++] [백준 5598] 카이사르 암호 (pps 3-3) 문제 풀기 전 생각 : 평소의 나였으면 문자열을 입력받은후 반복문으로 쪼개 아스키코드 를 활용해 풀었을테지만 3-2 문제를 풀고 난 후 scanf()을 한개씩 받고 바로바로 판별해서 출력하기로 했다. #include using namespace std; int main(){ string s; cin >> s; for (size_t i = 0; i < s.length(); i++) { if(s[i] == 'A') s[i] = 'X'; else if(s[i] == 'B') s[i] = 'Y'; else if(s[i] == 'C') s[i] = 'Z'; else s[i] = s[i] - 3; } cout 2021. 7. 13.
[C++] [백준 11721] 열 개씩 끊어 출력하기 (pps 3-2) d 문제 풀기 전 생각 : 문자열을 입력받은후 char 기준으로 한글자씩 출력하며 10의 배수마다 줄바꿈을 하는 방법 #include using namespace std; int main() { string s; cin >> s; for(int i=0 ; i 2021. 7. 13.
3-1. Student Attendance Record I (LeetCode 551) 문제 풀기 전 생각 : 입력 받은 s를 에 A가 몇개 있는지 카운팅해보고 연속해서 L 이 3번 이상 등장 한 적이 있는지 판별하는 방법으로 문자열을 쪼개는 방법을 사용했다. 반복문 안에 조건문으로 판별했는데 코드를 다 짜고 보니 L의 갯수를 세는 것보다 LLL아 문자열 안에 있는지 판별하면 더 효율적일거 같다는 생각을 했습니다. 그래서 다시 풀었죠. class Solution { public: bool checkRecord(string s) { int late = 0; int absent = 0; for(int i=0 ; i= 3) return false; } return (absent < 2); } }; //1차 풀이 여기서 개선 할 수 있는 방법을 떠올림 class Solution { public: .. 2021. 7. 10.
2-10. ZigZag Conversion (LeetCode 6) 문제 풀기 전 생각 : 먼저 변수를 생성합니다 int 타입의 index를 선언합니다. char 타입의 이차원배열을 선언합니다. 변수 row 를 만듭니다. row는 0으로 초기화합니다. 마지막 변수로 level을 선언합니다. level은 column의 역할을 합니다. 와일문으로 매 반복마다 index을 1씩 증가시키고 index가 s의 길이보다 길어지거나 같아지면 반복을 멈춘다. 반복마다 row를 증가시키며 만약 row가 numRows-1 과 같아지면 반복마다 감소시킨다. 그리고 감소하다 0에 도달하면 다시 증가하게 한다. 바로 위의 칸이 비어있다면 올라가고 있는 중이니 level을 증가시키고 만약 차있다면 그대로 둔다. 로 하려고 했지만 완성하고 메모리가 생각보다 많이 들어서 생각을 조금 더 해보니 굳이.. 2021. 7. 9.
2-9. Repeated String Match (LeetCode 686) 문제 풀기 전 생각 : while 문으로 반복하며 스트링 타입의 변수 s를 추가해 s에 a를 계속 더하며 s에 b가 포함되어 있는지 판별하는 식으로 문제를 풀려고 했다. 반복의 종료조건은 s가 b보다 세배 이상 커지면 으로 하려고 했지만 처음부터 세배 이상 큰 a가 들어온다면 위에서 생각한 종료조건은 완벽한 종료조건이 아니다. 이 문제를 해결하려 a가 b보다 크다면 a에 b가 포함되는지 판변하고 한번만 더 판별하도록 했다. 그 후에도 포함되지 않는다면 그건 포함될 수 없는 케이스 라고 판별하도록 했다. 제출을 하자 Time Limit Exceeded 가 떴다. 그 이유를 보니 b가 굉장히 길었으며 a는 단 한글자였고 심지어 포함될 수 없는 조건이었기 때문이었다. 그래서 만약 a가 한글자라면 b에 a를 제.. 2021. 7. 8.
2-8. IBM 빼기 1 (백준 6321) 문제 풀기 전 생각 : 입력받을 문자열의 수 만큼 반복하며 매 반복마다 입력받은 문자열의 아스키코드를 1씩 증가시키는 방식을 떠올렸습니다. Z가 나온다면 A로 변환하는것을 조건문을 통해 구현하고 출력하도록 했습니다. 어려운 문제는 아닌듯 합니다. #include using namespace std; int main() { int n; string s; cin >> n; for(int i=0 ; i > s; cout 2021. 7. 8.