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

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

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

www.acmicpc.net/problem/2469

2469번: 사다리 타기

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

www.acmicpc.net

C++ 사다리 타기 - C++ sadali tagi
C++ 사다리 타기 - C++ sadali tagi
https://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;   
    }
}