이렇게 if를 많이 쓰고, 중첩이 많이되면 찝찝하다....
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for(vector<string> place: places){
int ans = 1;
for(int i=0; i<place.size(); i++){
for (int j=0; j<place[i].size(); j++){
if(place[i][j] != 'P') continue;
bool right_partition = (j+1<5)? place[i][j+1] =='X': false;
bool left_partition = (j-1>=0)? place[i][j-1] == 'X': false;
bool up_partition = (i-1>=0)? place[i-1][j] == 'X': false;
bool down_partition = (i+1<5)? place[i+1][j] == 'X': false;
// right [i][j+2]
if(!right_partition)
if((j+2 < 5 && place[i][j+2] == 'P')||(j+1 < 5 && place[i][j+1] == 'P')) ans = 0;
// right-up [i-1][j+1]
if(!right_partition | !up_partition)
if(i-1 >= 0 && j+1 < 5 && place[i-1][j+1] == 'P') ans = 0;
// right-down [i+1][j+1]
if(!right_partition | !down_partition)
if(i+1 < 5 && j+1 < 5 && place[i+1][j+1] == 'P') ans = 0;
// left [i][j-2]
if(!left_partition)
if((j-2 >= 0 && place[i][j-2] == 'P')||(j-1 >= 0 && place[i][j-1] == 'P')) ans = 0;
// left-up [i-1][j-1]
if(!left_partition | !up_partition)
if(i-1 >= 0 && j-1 >= 0 && place[i-1][j-1] == 'P') ans = 0;
// left-down [i+1][j-1]
if(!left_partition | !down_partition)
if(i+1 < 5 && j-1 >= 0 && place[i+1][j-1] == 'P') ans = 0;
// up [i-2][j]
if(!up_partition)
if((i-2 >= 0 && place[i-2][j] == 'P')||(i-1 >= 0 && place[i-1][j] == 'P')) ans = 0;
// down [i+2][j]
if(!down_partition)
if((i+2 < 5 && place[i+2][j] == 'P')||i+1 < 5 && place[i+1][j] == 'P') ans = 0;
}
}
answer.push_back(ans);
}
return answer;
}
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for(vector<string> place: places){
int ans = 1;
for(int i=0; i<place.size(); i++){
for (int j=0; j<place[i].size(); j++){
if(place[i][j] != 'P') continue;
bool right_partition = (j+1<5)? place[i][j+1] =='X': false;
bool left_partition = (j-1>=0)? place[i][j-1] == 'X': false;
bool up_partition = (i-1>=0)? place[i-1][j] == 'X': false;
bool down_partition = (i+1<5)? place[i+1][j] == 'X': false;
// right [i][j+2]
if(!right_partition)
if((j+2 < 5 && place[i][j+2] == 'P')||(j+1 < 5 && place[i][j+1] == 'P')) {
ans = 0;
break;
}
// right-up [i-1][j+1]
if(!right_partition || !up_partition)
if(i-1 >= 0 && j+1 < 5 && place[i-1][j+1] == 'P') {
ans = 0;
break;
}
// right-down [i+1][j+1]
if(!right_partition || !down_partition)
if(i+1 < 5 && j+1 < 5 && place[i+1][j+1] == 'P') {
ans = 0;
break;
}
// left [i][j-2]
if(!left_partition)
if((j-2 >= 0 && place[i][j-2] == 'P')||(j-1 >= 0 && place[i][j-1] == 'P')) {
ans = 0;
break;
}
// left-up [i-1][j-1]
if(!left_partition || !up_partition)
if(i-1 >= 0 && j-1 >= 0 && place[i-1][j-1] == 'P') {
ans = 0;
break;
}
// left-down [i+1][j-1]
if(!left_partition || !down_partition)
if(i+1 < 5 && j-1 >= 0 && place[i+1][j-1] == 'P') {
ans = 0;
break;
}
// up [i-2][j]
if(!up_partition)
if((i-2 >= 0 && place[i-2][j] == 'P')||(i-1 >= 0 && place[i-1][j] == 'P')) {
ans = 0;
break;
}
// down [i+2][j]
if(!down_partition)
if((i+2 < 5 && place[i+2][j] == 'P')||i+1 < 5 && place[i+1][j] == 'P') {
ans = 0;
break;
}
}
if(ans == 0) break;
}
answer.push_back(ans);
}
return answer;
}
문제
https://programmers.co.kr/learn/courses/30/lessons/81302
코딩테스트 연습 - 거리두기 확인하기
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]
programmers.co.kr
[접근1]
partition 유무 구하기.
맨해튼 거리가 2인 곳의 partition은 있어도 없어도 상관이 없다. P만 없으면 됨.
각 index가 범위 안에 있는지 확인하고 있으면 'X'의 유무를 저장, 벗어나면 false를 저장.
bool right_partition = (j+1<5)? place[i][j+1] =='X': false;
bool left_partition = (j-1>=0)? place[i][j-1] == 'X': false;
bool up_partition = (i-1>=0)? place[i-1][j] == 'X': false;
bool down_partition = (i+1<5)? place[i+1][j] == 'X': false;
[접근2]
하나의 place를 시작할 때 ans를 1로 해놨다.
만약 왼쪽이 막혀있다면 2칸 왼쪽은 의미없고, 막혀있지 않으면 2칸 왼쪽을 확인해서 'P'이면 ans를 0으로 만들어주면 된다.(break를 넣을거였는데 너무 많은 if문에 정신없어서 깜빡한거같다)
왼쪽 위는 왼쪽과 위쪽 partition이 동시에 존재하면 의미가 없다 하나만 존재하거나 아예없다면 왼쪽 위를 확인해주면된다.(||을 쓰면 되는데 ^(XOR)을 생각하다가 비트연산자인 |을 써버렸다)
나머지도 같은 방법으로 진행했다.
// right [i][j+2]
if(!right_partition)
if((j+2 < 5 && place[i][j+2] == 'P')||(j+1 < 5 && place[i][j+1] == 'P')) ans = 0;
// right-up [i-1][j+1]
if(!right_partition | !up_partition)
if(i-1 >= 0 && j+1 < 5 && place[i-1][j+1] == 'P') ans = 0;
// right-down [i+1][j+1]
if(!right_partition | !down_partition)
if(i+1 < 5 && j+1 < 5 && place[i+1][j+1] == 'P') ans = 0;
// left [i][j-2]
if(!left_partition)
if((j-2 >= 0 && place[i][j-2] == 'P')||(j-1 >= 0 && place[i][j-1] == 'P')) ans = 0;
// left-up [i-1][j-1]
if(!left_partition | !up_partition)
if(i-1 >= 0 && j-1 >= 0 && place[i-1][j-1] == 'P') ans = 0;
// left-down [i+1][j-1]
if(!left_partition | !down_partition)
if(i+1 < 5 && j-1 >= 0 && place[i+1][j-1] == 'P') ans = 0;
// up [i-2][j]
if(!up_partition)
if((i-2 >= 0 && place[i-2][j] == 'P')||(i-1 >= 0 && place[i-1][j] == 'P')) ans = 0;
// down [i+2][j]
if(!down_partition)
if((i+2 < 5 && place[i+2][j] == 'P')||i+1 < 5 && place[i+1][j] == 'P') ans = 0;
[접근3]
다음 place를 돌기 전, ans를 answer에 집어넣어준다.
answer.push_back(ans);'coding > algorithm' 카테고리의 다른 글
| [programmers] Lv.2 수식 최대화(c++) (0) | 2022.05.01 |
|---|---|
| [programmers] Lv.1 키패드 누르기(c++) (0) | 2022.05.01 |
| [programmers] Lv.3 표 편집(c++) (0) | 2022.04.27 |
| [programmers] Lv.3 추석 트래픽(c++) (0) | 2022.04.25 |
| [programmers] Lv.2 오픈채팅방(c++) (0) | 2022.04.18 |
댓글