백준: Silver⑤ - 1476, 1531, 1544, 1730

2 분 소요


</br> 계속 풀이
</br>

1476: 날짜 계산

https://www.acmicpc.net/problem/1476

1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19 일 때 E S M으로 날짜 표현하기

    if( e == s && e == m ){
        cout << e << endl;
        return 0;
    }
    e %= 15;
    s %= 28;
    m %= 19;
    int ans = 16;
    while( 1 ){
        if( e == ans % 15 && s == ans % 28 && m == ans % 19 ){
            break;
        }
        ans++;
    }
    cout << ans << endl;

1씩 늘리면서 나머지가 같아질 때를 찾으면 끝
</br>

1531: 투명

https://www.acmcpc.net/problem/1531

불투명 종이가 m번 초과 겹쳐지면 안 보일 때, 안 보이는 칸 개수 구하기

    for(int i = 0; i < n; i++){
        int x1,y1, x2,y2;
        cin >> x1 >> y1 >> x2 >> y2;
        for(int j = x1; j <= x2; j++){
            for(int k = y1; k <= y2; k++){
                mmap[j][k]++;
            }
        }
    }
    int cnt = 0;
    for(int i = 1; i < 101; i++){
        for(int j = 1; j < 101; j++){
            if( mmap[i][j] > m ) cnt++;
        }
    }
    cout << cnt << endl;

그냥 가려질 때마다 칸 마다 1씩 더해주고 m보다 크면 안 보이니까 카운트 해 줌
</br>

1544: 사이클 단어

https://www.acmcpc.net/problem/1544

어떤 단어가 순환해서 다른 단어가 되면 같은 단어라고 보기

    int cnt = 0;
    map<string, int> m;
    for(int i = 0; i < n; i++){
        string s;
        cin >> s;
        if( m.find(s) == m.end() ){
            for(int j = 0; j < s.size(); j++){
                m.insert(pair<string, int>(s.substr(j, s.size()-j) + s.substr(0, j), 1));
            }
            cnt++;
        }
    }
    cout << cnt << endl;

어떻게 할까 했는데, 그냥 단어 하나가 들어오면 맵에다 순환한 단어들을 다 넣어 버리고, 다음 단어가 맵 안에 있으면 같은 단어이므로 체크하지 않는다.
</br>

1730: 판화

https://www.acmicpc.net/problem/1730

커맨드 입력 받아서 이동한 자국 출력하기

    int pi = 1, pj = 1;
    for(int i = 0; i < s.size(); i++){
        int cmd1 = 0, cmd2 = 0;
        if( s[i] == 'U' ) cmd1 = -1;
        else if( s[i] == 'D' ) cmd1 = 1;
        else if( s[i] == 'L' ) cmd2 = -1;
        else if( s[i] == 'R' ) cmd2 = 1;

        if( mmap[pi+cmd1][pj+cmd2] == -1 ) continue;

        if( mmap[pi][pj] == 1 && cmd2 ) mmap[pi][pj] = 3;
        else if( mmap[pi][pj] == 2 && cmd1 ) mmap[pi][pj] = 3;
        else if( mmap[pi][pj] == 0 && cmd1 ) mmap[pi][pj] = 1;
        else if( mmap[pi][pj] == 0 && cmd2 ) mmap[pi][pj] = 2;

        pi += cmd1;
        pj += cmd2;

        if( mmap[pi][pj] == 1 && cmd2 ) mmap[pi][pj] = 3;
        else if( mmap[pi][pj] == 2 && cmd1 ) mmap[pi][pj] = 3;
        else if( mmap[pi][pj] == 0 && cmd1 ) mmap[pi][pj] = 1;
        else if( mmap[pi][pj] == 0 && cmd2 ) mmap[pi][pj] = 2;

    }

    for(int i = 1; i < n+1; i++){
        for(int j = 1; j < n+1; j++){
            if( mmap[i][j] == 3 ) cout << '+';
            else if( mmap[i][j] == 2 ) cout << '-';
            else if( mmap[i][j] == 1 ) cout << '|';
            else if( mmap[i][j] == 0 ) cout << '.';
        }
        cout << endl;
    }

그냥 복붙하면서 구현했다
세로 방향일 땐 1, 가로 방향일 땐 2, 모두 갔으면 3으로 저장해 두고 출력해 준다.
</br>


실버 5 좋다
</br>

댓글남기기