본문 바로가기
[백준]

[BaekJoon/백준] 1063번 킹

by Hevton 2022. 7. 6.
반응형

 

C++ 문제 풀 때 string 다루는게 제일 어려운 것 같다.

string, char 변환에 너무 어려움을 여전히 겪는다.

자바 쓸땐 정말 쉬웠는데 ㅜㅜ

 

 

 

복잡하고 귀찮다고 생각하면 확실히 더 못 풀게 되는 것 같다.

그리고 생각나는 풀이가 깔끔하지 못하다고 생각되더라도, 나름의 확신으로 자신감을 갖고 코딩하는 것도 필요한 것 같다. 

그러다 보면 코딩하면서 스스로 더 정리되는 것도 있는 것 같다.

#include <iostream>

using namespace std;

string King, Stone;
int N;

int main() {
    
    string mv; // 움직이는 입력값
    int m1, m2; // 움직이는 입력값 => 좌표로 변환
    
    cin >> King >> Stone >> N;
    
    
    while(N--) {
        
        cin >> mv;
        
        m1 = m2 = 0;
        
        
        if(mv.find("R") != -1)
            m1 = 1;
        if(mv.find("L") != -1)
            m1 = -1;
        if(mv.find("B") != -1)
            m2 = -1;
        if(mv.find("T") != -1)
            m2 = 1;
        
        
        // 킹이 움직이는 것 시뮬레이션
        string nKing = "";
        nKing += (char)(King[0] + m1);
        nKing += (char)(King[1] + m2);
        
        if(nKing[0] < 'A' || nKing[0] > 'H' || nKing[1] < '1' || nKing[1] > '8') // 벗어남
            continue; // 벗어나면 입력 무시하고 다음 입력
        
        
        
        if(nKing == Stone) { // 가려는 곳에 돌이 있다면
            
            // 돌이 움직이는 것 시뮬레이션
            string nStone = "";
            nStone += (char)(Stone[0] + m1);
            nStone += (char)(Stone[1] + m2);
            
            // 돌이 같이 움직이는데 맵을 벗어남
            if(nStone[0] < 'A' || nStone[0] > 'H' || nStone[1] < '1' || nStone[1] > '8') // 벗어남
                continue;
            else // 안벗어나면 돌 움직임
                Stone = nStone;
        }
        
        
        King = nKing; // 여기까지 정상적으로 오면 킹 움직임.
        
    }
    
    cout << King << "\n" << Stone << "\n";
    
}

 

내 풀이의 장점 :

다른 분들의 풀이도 찾아보았는데, 나름 나도 깔끔하게 풀이한 것 같다.

방향성을 처리할 때, 상하좌우에 대한 이동 좌표값만 체크해주면 대각선은 알아서 처리할 수 있다.

 

 

내 풀이의 단점 :

나는 위치를 문자열로 담아서 연산했는데,

각각의 포지션을 int 형태의 pair로 변환시켜서 계산하신 분도 계셨다. 그렇게 하면 조금 더 깔끔할 수 있을 것 같다.

 

 

 

소요 시간 : 40분

반응형