STL에서 제공하는 를 사용하면 간단하게 문자열 비교를 통하여서 문제를 풀 수 있다. 이 문제를 풀면서 한 가지 유의했던 점은 시간인데, 기존에 시간을 절약하기 위해서 ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 를 사용하였는데 이 문제는 이 것으로는 충분하지 않았다. 놓치고 있었던 부분 중 하나는 출력해줄 때 줄바꿈 연산자인 endl 를 사용하면 속도가 느려진다는 점이다. 또 하나는 if 문을 연달아 사용하는 것이었는데, 안좋은 습관 중 하나가 if~ else if 문을 사용하지 않고 if 문만 사용했다는 점이다. 이 부분도 실수하지 말아야할 부분 중 하나다. #include #include using namespace std; int ma..
전체 글
이 문제는 C/C++ 에서 큰 정수를 다루는데 어떻게 다룰 수 있는지 배울 수 있는 문제이다. C/C++에서 담을 수 있는 정수형 자료형으로는 택도 없이 부족한 큰 두 수가 주어진다. 그럴 때 정수를 문자열로 입력 받아서 문자형으로 해결할 수 있다. 나의 접근법은 문자열을 끝에서부터 한 자리씩 int 형으로 변환하여 더해주어 10이 넘어가면 올려주고, 안 넘어가면 그대로 두는 방식을 택했다. 이 때 문자열의 한 글자를 떼어보면 char형으로 분류되고 이를 int 형으로 변환하려 하면 해당 문자의 ASCII 코드의 정수값으로 변환되어 계산이 된다. 이 때문에 char를 int형으로 변환하기전에 '0' 으로 빼주면 ASCII 코드 표에서 상대적인 한 자리 정수값을 구할 수 있다. 이렇게 한 자리씩 계산한 다..
이 문제는 패턴을 찾고 순서에 알맞는 패턴의 값을 출력하면 된다. 분수는 일정한 패턴으로 분자와 분모가 변한다. 우선 분자와 분모의 최대값이 자연수로 정해진다. 1번째 분수는 1이 최대값 2~3번째 분수는 2가 최대값 4~6번째 분수는 3이 최대값 7~10번째 분수는 4가 최대값 11~15번째 분수는 5가 최대값 ... 최대값이 짝수이고 i로 표현할 때 분수는 1/i, 2/(i - 1), ... , i/1 순서로 배정되고 최대값이 홀수일때는 분수는 i/1, (i - 1)/2, ... , 1/i 순서로 배정된다. 구하고자 하는 정수가 입력되면 반복문을 돌며 최대값이 몇 인 범위의 몇 번째 수인지를 구해서 분자와 분모를 구분하여 출력해주면 된다. #include using namespace std; int ..
처음 이 문제를 접근했을 때는 while문으로 낮과 밤에 올라가고 내려가는 수를 계산하기로 했었다. 예시 문제에 대한 정답은 맞았으나, 시간초과라는 결과가 떠서 다른 식으로 접근해야했는데, 문제를 보면 낮과 밤에 올라가고 내려가는 것을 수식으로 결정할 수가 있다. 우선 항상 모든 방식은 A - B + A - B + A - B + ... + A - B + A 패턴으로 이어지며 무조건 A가 더해지면서 끝나게 되어있다. 막대기를 다 올라간 경우 내려올 일은 없으니까. 따라서 걸린 일 수를 x 변수로 설정하고 수식화 하면 xA - (x-1)B >= V 가 나오고 정리하면 x >= (V - B) / (A - B) 가 된다. 여기서 오른쪽 식이 딱 떨어지는 경우와 아닌 경우로 나위어서 딱 떨어질 경우 그대로 x를 ..