본문 바로가기
Algorithm

[백준/BOJ] 20125번 쿠키의 신체 측정 C++

by SoyeonCha 2024. 11. 7.

문제 링크 : https://www.acmicpc.net/problem/20125

 

틀린 코드

out of bounds 에러 뜸

#include <bits/stdc++.h>
using namespace std;

string arr[1001][1001];

int main(){
    int n;
    cin >> n;
    
    /*
    string p;
    for (int i=1; i<=n; i++){
        for (int j=0; i<=n; j++){
            cin >> p;
            if(p=="*"){
                arr[i][j] = 1;
            }
        }
    }
    */
    
    int x, y;
    while (true){
        for (int i=1; i<=n; i++){
            for (int j=0; i<=n; j++){
                if (arr[i][j]=="*"){
                    x = i;
                    y = j;
                    break;
                }
            }
        }
    }
    
    int a,b,c,d,e;
    a=0;
    b=0;
    c=0;
    d=0;
    e=0;
    
    while (true){
        for (int i=y-1; i>0; i--){
            if(arr[x][i]=="*")
                a++;
            else
                break;
        }
    }
    while (true){
        for (int i=y+1; i<=n; i++){
            if(arr[x][i]=="*")
                b++;
            else
                break;
        }
    }
    while (true){
        for (int i=x+1; i<=n; i++){
            if(arr[i][y]=="*")
                c++;
            else
                break;
        }
    }
    while (true){
        for (int i=x+d+1; i<=n; i++){
            if(arr[i][y-1]=="*")
                d++;
            else
                break;
        }
    }
    while (true){
        for (int i=x+d+1; i<=n; i++){
            if(arr[i][y+1]=="*")
                e++;
            else
                break;
        }
    }
    cout << x << y << '\n' << a << b << c << d << e;
    return 0;
}

 

메모

- arr의 인덱스를 행 0~n, 열 0~n으로 두고, (1,1)은 arr의 행 1 열 1에 해당하도록 설계했는데 한 줄씩 입력받는 스트링 p는 인덱스 0부터 시작함을 고려하지 않았음. arr[i][j]=p[j-1]로 작성해야 되는데 arr[i][j]=p[i]로 잘못 작성했었음.

- 심장의 위치 저장해야 되는데 머리 위치 반환했음. x에 i+1을 넣어야 되는데 i를 넣었음.

- 배열 범위 잘 좀 생각해. 뭘 구한 건지 똑바로 봐.

- string 비교하는 조건문에서는 " " 사용, char 비교하는 조건문에서는 ' ' 사용해야 됨

- 초기값 설정해두면 값이 업데이트 됐는지 조건문으로 확인 가능. 여기서는 x=-1; 로 설정해뒀어서 심장의 위치를 찾았는지 확인하고 break; 쓸 수 있었음.

- 결과값 출력할 때 값들 사이에 공백을 둬야 한다는 조건 확인. 출력 형식 잘 확인해.

- while(true)문 남발했는데, for문만으로 해결 가능한 문제였음

 

 

맞힌 코드

#include <bits/stdc++.h>
using namespace std;

int main(void){
    int n;
    cin >> n;
    char arr[1001][1001];

    string p;
    for (int i = 1; i <= n; i++) {
        cin >> p;
        for (int j = 1; j <= n; j++) {
            arr[i][j] = p[j - 1];
        }
    }
    
    int x = -1, y = -1;
    // 심장의 위치
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (arr[i][j]=='*'){
                x = i+1;
                y = j;
                break;
            }
        }
        if (x != -1) break;
    }

    int a = 0, b = 0, c = 0, d = 0, e = 0;
    
    // 왼쪽 팔 길이
    for (int i = y - 1; i > 0; i--) {
        if (arr[x][i] == '*')
            a++;
        else
            break;
    }

    // 오른쪽 팔 길이
    for (int i = y + 1; i <= n; i++) {
        if (arr[x][i] == '*')
            b++;
        else
            break;
    }

    // 허리 길이
    for (int i = x + 1; i <= n; i++) {
        if (arr[i][y] == '*')
            c++;
        else
            break;
    }

    // 왼쪽 다리 길이
    for (int i = x + c + 1; i <= n; i++) {
        if (arr[i][y - 1] == '*')
            d++;
        else
            break;
    }

    // 오른쪽 다리 길이
    for (int i = x + c + 1; i <= n; i++) {
        if (arr[i][y + 1] == '*')
            e++;
        else
            break;
    }

    cout << x << " " << y << '\n';
    cout << a << " " << b << " " << c << " " << d << " " << e;
}