목록전체 글 (179)
有希
#include using namespace std; int main() { int N; cin >> N; //전체 별의 개수는 2*N //별의 개수를 1~N까지 증가시키며 앞뒤로 2번 출력 //공백의 개수는 2*N - 2*i //1~N개까지 출력 for(int i=1; i
킹받는 문제. 흔히 아는 " 뿐만 아니라 \(백슬래시) 또한 n과 붙어 특수한 기능을 하므로 \도 고려해야 한다. 문자열로 넣는 방법은 "과 마찬가지로 \를 하나 붙여주면 된다. #include using namespace std; int main() { cout
원형으로 0번째 ~ 마지막 원소가 모두 제거될 때까지 무한으로 즐겨야 한다. 만약 벡터를 사용해서 원형으로 둘러 앉은 것을 구현했다고 치자, K번째 원소를 제거했다면 해당 원소는 건너뛰고 idx를 세어야 하므로 K번째 원소를 -1로 밀어버리고 스킵하는 부분을 넣어야 한다. 어쨌든 벡터는 원소 제거에 있어 비용이 n만큼 드므로 -1로 밀어야 한다. erase를 써도 무방할 테지만 웬만하면 하지 말자. 저렇게 하면 코드가 너저분해질 것이 뻔하다. 어차피 계속 순차탐색을 할 것이므로 원소 제거에 좋은 list를 사용한다. 알고리즘은 다음과 같다. 1. list에 사람을 넣는다. 2. 첫 번째 원소부터 탐색하며 K번째 사람이면 제거된 순서를 저장할 벡터에 저장하고 제거한다. 이후 cnt=1로 초기상태로 돌아간다..
출처: https://yonmy.com/archives/9 YonMy » std::map(set) insert 정확하게 사용하기 꽤나 많은 프로그래머들이 std::map insert 의 사용을 잘 못 하고 있는 경우가 있어서, 오늘은 그것에 대해 이야기 하려고 한다. 우선 std::map의 insert의 기본형을 보면 다음과 같다. pair inser yonmy.com 나나 다른 사람들의 코드를 보면 대부분 이렇게 쓰고 있다. std::map temp; auto itr = temp.find(1); if (itr == temp.end()) { temp.insert({ 1, "number 1" }); } else { itr->second = "number 1"; } 1. 우선 find 2. 찾지 못했다면 i..
우리가 찾아야 하는 점은 좌표 중 한 번씩만 등장한 녀석들을 x,y좌표로 가지고 있는 점이다. map을 두 개 써서 x, y 의 등장횟수를 저장한 뒤 1이면 출력시켜주면 된다. #include using namespace std; int main() { map posX; map posY; for(int i=0; i> x >> y; posX[x]++; posY[y]++; } auto iter = posX.begin(); while(iter != posX.end()) { if(iter->second==1) cout first second==1) cout first; iter++; } return 0; }
간단하지만 주의해야할 점이 있다. *를 찍고 나서 공백을 한 번 더 찍어주는 것이 아닌 바로 다음 줄로 이동해야 한다. #include using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { //전체 길이 = ((2n-1) - (2*i+1))/2 for (int j = 0; j < ((2*n-1) - (i*2 + 1)) / 2; ++j) cout
문제를 읽고 입력의 끝을 어떻게 찾아야하지 고민하는 경우가 많다. 이런 문제들이 으레 그러하듯이, 무식하게 풀면 된다. 입력이 최대 100줄이고, 각 줄은 100글자를 넘지 않는다고 했으니, getline으로 100번 긁어오면 된다. 연산 시간이나 무식하게 하나하나 입력받을 때 발생할 수 있는 문맥교환등도 무시 가능할 정도로 적은 횟수이다. #include #include using namespace std; int main() { string s; for(int i=0; i
처음에는 벡터를 이용해서 0이 아니면 벡터에 넣고 0이면 개수를 센 뒤, 벡터사이즈 - 0의 개수만큼만 벡터에서 더하면 되겠지 하고 생각했었다. 문제는 가장 처음에 0 이 올 경우이다. 문제에서 주어진 3 0 4 0 케이스를 약간 비꼬아서 0 0 3 4 일 경우에 위에처럼 알고리즘을 짜게 되면 vec사이즈는 2, 0의 개수도 2가 되어 0을 출력하게 된다. 고로 stl중 stack을 이용하여 푸는게 가장 보편적이고 좋은 풀이이다. 홍대병을 버리면 되는 문제. #include #include using namespace std; int main() { stack s; int n; cin >> n; for(int i=0; i> a; if(a==0) s.pop(); else s.push(a); } int re..
주의할 점은 2,3 글자가 하나의 글자로 치환된다는 점이다. 즉, 2,3글자마자 체크하여 치환된 문자가 아니라면 따로 세야한다. 예제입력1의 예시를 보면 lj / e / s= / nj / a / k 로 나뉘는데, 현재 e에서 시작하여 문자를 체크한다고 하면 e es es= 의 3가지가 가능하다. case "e" : 2,3번째 글자를 체크해야하니 아무것도 하지 않고 case "es" : 2글자이므로 치환 문자에 속하는지 확인하고 맞다면 알파벳 개수를 1 증가시킨다. 아니라면 3글자일 수도 있으므로 아무것도 하지 않는다. case "es=" 일 때에는 3글자이므로 치환 문자에 속하는지 확인하고 맞다면 알파벳 개수를 1증가시킨다. 아니라면 치환된 문자에 속하지 않는 첫번째 글자 단독으로 하나의 알파벳이므로 알..