https://school.programmers.co.kr/learn/courses/30/lessons/120861
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<string> keyinput, vector<int> board) {
vector<int> answer;
int x=0;
int y=0;
int limitx=board[0]/2;
int limity=board[1]/2;
for(auto str: keyinput){
if(str=="left" && x-1>=-limitx){
x--;
}
else if(str=="right"&& x+1<=limitx){
x++;
}else if(str=="up"&& y+1<=limity){
y++;
}else if(str=="down"&& y-1>=-limity){
y--;
}
}
answer.emplace_back(x);
answer.emplace_back(y);
return answer;
}
위의 경우 내가 수정해서 제출해서 통과한 코드이고, 아래에 첨부할 것이, 처음에 예제는 통과했는데, 제출했을때 케이스 2개에서 실패한 코드이다. 이때에 뭔가 else 부분에서 예외처리가 제대로 이루어지지 않아서 통과하지 못하고 있는것일 것이라는 생각이 들어서 위와 같이 확실하게 else if 를 사용해서 str=="down" && y-1>=-limity 형태로 둘다 만족하는 경우로 수정해서 제출해서 통과하였다.
일단 수정 하기 전의 코드를 첨부해보면,
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<string> keyinput, vector<int> board) {
vector<int> answer;
int x=0;
int y=0;
int limitx=board[0]/2;
int limity=board[1]/2;
for(auto str: keyinput){
if(str=="left" && x-1>=-limitx){
x--;
}
else if(str=="right"&& x+1<=limitx){
x++;
}else if(str=="up"&& y+1<=limity){
y++;
}else{
if(y-1>=-limity){
y--;
}
}
}
answer.emplace_back(x);
answer.emplace_back(y);
return answer;
}
이와같이 맨 마지막 판별에서 else 를 사용해서 나머지에 대해서 if(y-1>=-limity) 인 경우에 대해서 y--;을 시행하는 코드를 작성했는데,
실패한걸 보고나니 든 생각이, 위의 경우들은 && 로 엮여있는 경우들을 걸러내서 판별하고 넘어가는데, &&로 엮여있기 때문에 매우 특별한 경우들만 걸려들고, else의 경우는 나머지 모두에 대해서 판별을 하기 때문에, 꼭 down에 대해서만 판별하지 않게 되는 경우가 발생할 수 있다고 판단하여서 위의 코드를 수정하였다.
&& 을 사용했기 때문에 판별에서 모든 left, 모든 rigth, 모든 up을 걸러내주지 못할 것이기 때문이다.
이와같이 특별하게 케이스들을 특정지어서 판별을 할때에는, 맨 마지막 else의 경우 꼭 사용하려고 하지말고, 맨 마지막에도 else if로 특정지어서 판별해주고, 나머지 else의 경우는 그냥 그대로 두어서 어떠한 처리도 해주지 않는 형태로 만든다면 원하는 형태로 프로그램을 작성할 수 있을 것이다.
다른 사람의 풀이를 보니, 위와 같은 형태인데, 코드가 보기 편하고 간결하게 작성되어 있는 형태의 코드를 보아서 여기에 첨부해보겠다. 이와 같은 형태로 프로그램을 작성하는것이 다른 사람이 보기에도 편하고 좋을것 같다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(vector<string> keyinput, vector<int> board)
{
vector<int> answer;
vector<int> v(2,0); // 좌우 상하
for(string s : keyinput)
{
if (s=="up" && v[1]<+board[1]/2) v[1]++;
else if(s=="down" && v[1]>-board[1]/2) v[1]--;
else if(s=="left" && v[0]>-board[0]/2) v[0]--;
else if(s=="right" && v[0]<+board[0]/2) v[0]++;
}
answer=v;
return answer;
}
내가 작성한 것처럼 마지막도 else if를 활용해서 특정한 케이스로 나누어서 판별한것을 볼 수 있다.
그리고 vector<int> v(2,0); 형태로 x좌표, y좌표의 값을 0,0 으로 초기화 한걸 볼 수 있는데,
함수 내에서 선언하고 초기화 할때, vector의 경우 위와같이 vector<int> v(2,0); 형태로, 2개의 원소를 0으로 초기화해서 선언한걸 볼 수 있다. 이와 같은 선언과 초기화를 잘 알아두도록 하자.
지금까지는 주로 백준에서 전역변수 선언하면서 모두 0으로 초기화 하는 형태로 코드를 많이 작성했는데, 프로그래머스에서 작성할때는 위와 같이 지역변수 선언하면서 초기화까지 같이 해주어야 하는 경우들이 많이 있을 수 있으므로 이와 같은 방법에 대해서 익숙해지도록 하자. 위의 코드는 정말 보기 간결하고 깔끔하고 좋다. 이와 같이 작성하도록 노력하자.
만약 위의 코드를 더욱 간결하게 수정한다면, 이와 같이도 가능할 것이다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(vector<string> keyinput, vector<int> board)
{
vector<int> v(2,0); // 좌우 상하
for(string s : keyinput)
{
if (s=="up" && v[1]<+board[1]/2) v[1]++;
else if(s=="down" && v[1]>-board[1]/2) v[1]--;
else if(s=="left" && v[0]>-board[0]/2) v[0]--;
else if(s=="right" && v[0]<+board[0]/2) v[0]++;
}
return v;
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| Lv 0. 다항식 더하기 *다시 풀어보기* (0) | 2023.10.06 |
|---|---|
| Lv 0. 최댓값 만들기 (2). *다시 풀어보기* - 더 간결하게 (0) | 2023.10.03 |
| Lv 0. 직사각형 넓이 구하기. (0) | 2023.10.03 |
| Lv 0. 머쓱이보다 키 큰 사람 (0) | 2023.10.01 |
| Lv 0. 중복된 숫자 개수 - algorithm 헤더에 있는 count() 함수를 사용해보자. (0) | 2023.10.01 |
