C++ 사다리 타기 - C++ sadali tagi

구름에듀 5차 1번 문제

주어진 코드

#include <stdio.h> #include <stdbool.h> #include <stdlib.h> int solution(int ladders[][2], int ladders_len, int win) { int answer = 0; int player[6] = { 1, 2, 3, 4, 5, 6 }; for (int i = 0; i < ladders_len; i++) { int temp = player[ladders[i][0] - 1]; //빈칸 = temp; //빈칸 } answer = player[win - 1]; return answer; } int main() { int ladders[5][2] = { {1, 2}, {3, 4}, {2, 3}, {4, 5}, {5, 6} }; int ladders_len = 5; int win = 3; int ret = solution(ladders, ladders_len, win); printf("solution 함수의 반환 값은 %d 입니다.\n", ret); }

완성 코드

#include <stdio.h> #include <stdbool.h> #include <stdlib.h> int solution(int ladders[][2], int ladders_len, int win) { int answer = 0; int player[6] = { 1, 2, 3, 4, 5, 6 }; for (int i = 0; i < ladders_len; i++) { int temp = player[ladders[i][0] - 1]; player[ladders[i][0] - 1] = player[ladders[i][0]]; player[ladders[i][0]] = temp; } answer = player[win - 1]; return answer; } int main() { int ladders[5][2] = { {1, 2}, {3, 4}, {2, 3}, {4, 5}, {5, 6} }; int ladders_len = 5; int win = 3; int ret = solution(ladders, ladders_len, win); printf("solution 함수의 반환 값은 %d 입니다.\n", ret); }

예시

ladders ladders_len win return
[[1, 2], [3, 4], [2, 3], [4, 5], [5, 6]] 5 3 1

코드 분석

단계 과정
main 각각의 연결된 사다리의 위치가 저장된 배열 ladders와 연결된 횟수 ladders_len를 선언한다.
이긴 사람의 위치가 저장된 변수 win을 선언한 후 solution함수를 호출한다.
solution 사다리의 각 번호가 담긴 배열 players를 선언한다.
solution - for i=0 부터 i=사다리의 길이 만큼 반복한다.
임시변수 temp를 사용하여 player[ladders[i][0]-1]과 player[ladders[i][0]의 값을 교환한다.
문제분석 주어진 문제를 살펴보면, 각 사다리가 연결되는 조건은 서로 인접해있는 사다리 끼리만 연결할 수 있다는 것이다.
따라서 단순하게 연결된 사다리끼리 각 players의 번호를 교환해주면 코드는 해결된다.
solution 최종적으로 win의 위치에 있는 player가 승자이므로, player의 win번방-1(배열의 특성)에 있는 번호가 승자가 된다. (위의 예시에서는 1번 player가 win 위치인 3(2번방)에 위치함)
main 결과를 출력한 후 프로그램을 종료한다.

GroomEdu

goorm

구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.

www.goorm.io

www.acmicpc.net/problem/2469

2469번: 사다리 타기

첫 줄에는 참가한 사람의 수 k가 나온다(3≤k≤26). 그 다음 줄에는 가로 막대가 놓일 전체 가로 줄의 수를 나타내는 n이 나온다(3≤n≤1,000). 그리고 세 번째 줄에는 사다리를 타고 난 후 결정된 참

www.acmicpc.net

//www.acmicpc.net/problem/2469

시작 알파벳에서 '?' 전까지, 결과 알파벳에서 '?' 전까지 알파벳의 순서를 계속 수정합니다. 위의 예시에선 최종적으로 '?' 전의 시작 알파벳과 '?' 전의 결과 알파벳은 다음과 같이 만들어집니다.

시작 알파벳 : [C, A, D, B, E, G, F, H, I, J]

결과 알파벳 : [C, A, B, D, G, E, F, H, J, I]

두 결과를 비교하여 문자가 같다면 '*', 순서가 서로 교차되어 같다면 '-', 그 외의 경우라면 불가능한 경우로 k-1개 만큼 x를 출력하게 구현하여 해결할 수 있습니다.

#include <iostream> #include <vector> using namespace std; int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); int k, n, stop; // 사람의 수, 사다리의 행 길이, '?' 가 나오는 행 인덱스 cin>>k>>n; string start, end, answer; // 시작 알파벳, 결과 알파벳, 출력할 정답 vector<string> v; // 사다리 정보 저장 // 시작 알파벳 초기화, 결과 알파벳 입력 받기 for(int i = 0; i < k; i++) { start.push_back('A' + i); } cin>>end; // 사다리 정보 입력받고, '?' 나오는 행 인덱스 찾기 for(int i = 0; i < n; i++) { string str; cin>>str; v.push_back(str); if(str[0] == '?') stop = i; } // 시작 알파벳에서 '?' 전까지 알파벳 순서 수정 for(int i = 0; i < stop; i++) { for(int j = 0; j < v[i].size(); j++) { if(v[i][j] == '-') { swap(start[j], start[j + 1]); } } } // 결과 알파벳에서 '?' 전까지 알파벳 순서 수정 for(int i = n - 1; i > stop; i--) { for(int j = 0; j < v[i].size(); j++) { if(v[i][j] == '-') { swap(end[j], end[j + 1]); } } } // 알파벳 비교 bool flag = true; for(int i = 0; i < k - 1; i++) { if(start[i] == end[i]) { answer.push_back('*'); } else if( (start[i] == end[i + 1]) && (start[i + 1] == end[i]) ) { answer.push_back('-'); swap(start[i], start[i + 1]); } else { flag = false; break; } } if(!flag) { for(int i = 0; i < k - 1; i++) { cout<<"x"; } } else { cout<<answer; } }

Toplist

최신 우편물

태그