반응형

알고리즘 공부/C++ 366

백준 1991번 트리 순회 C++

리뷰전위, 중위, 후위 순회 겁먹지 말고 그냥 출력 시점만 조정해 주면 된다.우선 문제는 굉장히 친절하다, A, B, C 오름차순으로 주어지고 루트는 항상 A고 좌우 노드 모두 친절히 설명해 준다. 문제 풀이맵을 통해 앞의 노드를 키로 갖고 뒤의 값 두개를 pair로 받아준다.A를 시작으로 dfs를 돌려주고 '.'가 아닌 노드를 왼쪽부터 방문해 주면 된다.전위 순회 : dfs 재귀를 실행하기 전에 루트 노드부터 출력 해준다.중위 순회 : 왼쪽 노드 재귀를 실행한 후 루트 노드를 출력해 주면 된다.후위 순회 : 왼쪽 및 오른쪽 노드 모두 재귀를 실행해 주고 나서 루트 노드를 출력해 주면 된다.각 dfs 실행 사이에 줄바꿈을 한번씩 해주면 된다. 참고 사항 정답 코드#include #include #incl..

백준 16953번 A → B C++

리뷰BFS도 가능하지만 그리디 알고리즘으로 풀이가 가능하다. 문제 풀이b에서 a로 가는 방법으로 풀이한다.while루프의 조건은 a가 b보다 작거나 같을때 실행, cnt를 1 상승시키고 만약 a와 b가 같다면 루프를 종료한다.현재 b의 뒷자리가 1이라면 b를 10으로 나눈 몫을 b로 갱신해 준다.만약 b가 짝수라면 b를 2로 나눈 몫을 b로 갱신해 준다.둘다 해당되지 않다면 -1을 출력하고 리턴한다.중간에 리턴되지 않고 루프가 종료되었을때 a가 b보다 크다면 -1을, 아니라면 cnt를 출력한다. 참고 사항while루프가 종료되는 경우는 다음과 같다.1의 자리 뒤에 1을 붙이거나 2를 곱해도 a가 결코 b가 될 수 없을 때a가 b보다 커져서 루프가 종료 되었을 때 정답 코드#include using nam..

백준 1987번 알파벳 C++

리뷰시간 진짜 간당간당했다.. 방문 처리 배열 크기를 대충 100으로 잡았다가 시간초과가 떠서 범위에 딱 맞게 사용하니 통과되었다. 문제 풀이n * m 크기의 필드를 받아준다. 필드는 문자열 이므로 n크기의 1차원 배열로 초기화 해주면 된다.좌상단을 방문처리 해주고 dfs를 실행한다, 이때 필드는 주소 참조를, 방문처리는 새로운 리스트를 계속 만들어줬다.이후 4방향을 돌며 다음 좌표가 방문처리가 되지 않았다면 방문 처리 후 dfs 실행, 이후 방문처리를 다시 지워준다.더 이상 진행할 방향이 없어 for루프가 종료되면 현재 누적된 cnt를 ans와 비교하여 값을 갱신해 준다.dfs가 완전 종료된 이후 ans에 저장된 모든 cnt의 max값을 출력해 주면 된다. 참고 사항방문 배열의 인덱스를 넉넉하게 주지 ..

백준 5555번 반지 C++

리뷰부분 문자열이 있는지 체크 + 문자열 순환이 필요한 문제 문제 풀이부분 문자열 s를 받아오고 해당 문자의 길이를 변수 length에 초기화 한다.find 메서드를 통해 s의 첫 글자가 입력받은 문자열에 있는지 체크 하고 인덱스를 받아온다.해당 문자열이 있는 부분을 0번 인덱스로 바꿔준다.이후 s가 받아온 문자열에 온전히 있는지 체크해 준다. 참고 사항처음엔 for문을 돌려 모두 찾아주었는데 find 메서드를 사용하면 코드 한줄에 해결할 수 있다.  정답 코드#include #include using namespace std;int main() { string s; int n; int cnt = 0; cin >> s >> n; int length = s.size(); while (n--) { int ..

백준 9507번 Generations of Tribbles C++

리뷰이게 실버문제라니! DP로 피보나치 수열을 구하는 것과 동일한 방식 문제 풀이피보나치 수열을 구할 68크기의 벡터를 생성해 준다.0, 1, 2, 3에 인덱스에 해당하는 값을 미리 할당해 주고, 4부터 68까지는 for문으로 할당해 준다.각 테스트 케이스 마다 입력 받은 값을 인덱스로 하는 값을 출력해 준다. 참고 사항나중에 값이 매우 커지므로 int형식으로는 오버플로우가 될 것이다.  정답 코드#include #include using namespace std;int main() { vector fibo(68, 1); fibo[1] = 1, fibo[2] = 2, fibo[3] = 4; for (int i = 4; i > t; while (t--) { int c; cin >> c; cout

백준 10769번 행복한지 슬픈지 C++

리뷰find를 사용하여 문제를 풀면 된다. 문제 풀이getline을 통해 한줄 전체를 문자열 s로 받아준다.s를 돌며 :-)를 찾으면 cnt1을 1만큼 올려주고 발견 위치 다음부터 다시 탐색한다. 없을 경우 break마찬가지로 :-( 또한 찾아준 뒤 cnt2를 올려준다.cnt1와 cnt2를 비교하여 적절한 문자열을 출력해 주면 된다. 참고 사항없음  정답 코드#include #include using namespace std;int main() { int cnt1 = 0, cnt2 = 0; string s; getline(cin, s); int c = 0; while (1) { int a = s.find(":-)", c); if (a == -1) break; cnt1++; c = a + 1; } ..

백준 5347번 LCM C++

리뷰변수 형식 지키기가 너무나 어렵다... 휴 문제 풀이테스트 케이스의 개수 n과 정수 a, b에 값을 받아주고 lcm 함수에 a, b를 인자로 넣어준다.a, b중 작은 값을 gcd로 초기화 하고, a를 gcd로 나눈 값과 b를 gcd로 나눈 값이 모두 0이 될때까지 gcd를 빼준다.while루프를 벗어났을때 a, b중 큰 값과 a와 b를 변경된 gcd로 나눈 값 중 작은 값을 곱해준 뒤 리턴해 준다.lcm 함수로부터 리턴받은 값을 출력해 준다. 참고 사항두 수의 범위가 1,000,000 미만이므로 int 형식으로는 오버플로우가 난다, 리턴 시 long long 형식으로 바꿔준다.  정답 코드#include using namespace std;long long lcm(int a, int b) { int ..

백준 1940번 주몽 C++ 투 포인터

리뷰투포인터를 통해 해결한 문제 문제 풀이n, m을 입력받고 정수형 벡터를 n크기로 초기화 해준 후 각 인덱스에 값을 받아와 준다.벡터를 정렬해 주고 투포인터에 벡터와 n, m값을 인자로 전해준다. (전역 변수를 사용해도 된다.)왼쪽의 시작 인덱스는 0, 오른쪽의 시작 인덱스는 n-1로 왼쪽이 오른쪽보다 커지기 전까지 루프를 실행한다.왼쪽과 오른쪽 인덱스의 값을 더해주고 m과 같다면 개수를 1개 찾은 것이다, 왼쪽 인덱스 + 1 오른쪽 인덱스 - 1만약 값이 더 클경우 오른쪽 인덱스를 -1 해주고, 값이 더 작을경우 왼쪽을 +1 해주면 된다.마지막으로 찾은 개수를 리턴해 준 뒤 출력해 준다. 참고 사항전역 변수를 사용하면 더 편리할수도?  정답 코드#include #include #include usin..

백준 1159번 농구 경기 C++

리뷰map을 사용하였고, map을 순회하기 위해 auto 형식을 처음으로 사용해 보았다. 문제 풀이선수의 이름을 문자열로 받아와 주고 문자열의 첫번째를 key로 하는 map의 value를 1씩 올려주었다.map 전체를 순회하며 value 값이 5 이상일 경우 ans문자열에 key를 추가해 주었다.만약 ans가 비었다면 PREDAJA를 출력, 아닐 경우 ans를 출력해 주면 된다. 참고 사항없음  정답 코드#include #include #include using namespace std;int main() { map dic; int n; cin >> n; while (n--) { string s; cin >> s; if (dic[s[0]]) dic[s[0]]++; else dic[s[0]] = 1..

백준 1076번 저항 C++

리뷰unordered_map과 pow를 통해 푼 문제, C++로 문제를 풀며 처음으로 int값을 초과하는 문제였다, 문자열로 풀어도 괜찮았을듯 문제 풀이unordered_map을 통해 각 문자열에 해당하는 값을 짝지어 준다.입력값을 각각 문자열로 받은 후 각 key 맞는 value를 가져와 정수형으로 치환해 준다.첫번째 수를 10의 자리로, 두번째 수를 1의 자리로 받은 후 세번째 수를 10의 제곱으로 곱해준다.완성된 수를 출력해 준다. 참고 사항int형식으로 변수를 선언하여 틀렸습니다가 노출되었다 충분히 큰 수를 받을 수 있도록 long long 변수를 사용해 주자  정답 코드#include #include #include using namespace std;int main() { unordered_m..

728x90
반응형