본문 바로가기
알고리즘/프로그래머스

[프로그래머스] 행렬 테두리 회전하기

by 오오오니 2023. 3. 24.

https://school.programmers.co.kr/learn/courses/30/lessons/77485?language=cpp# 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

행렬을 진짜로 회전시켜서 제일 작은 숫자를 구했다.

첫 번째로 틀린건 회전할때  방향을 잘못해서 1->2->3->4행렬을 회전하니까 1->1->1->1이렇게 됐었다.

두 번째로 틀린건 행렬에서 나온 숫자를 bool형 배열에(n) 체크해서 제일 작은 숫자를 반환하게 했는데

n의 최댓값을 작게 잡아줬었다. 100x100+1 의 크기 이상으로 잡아줘야한다.

 

#include <string>
#include <vector>
#include<iostream>
using namespace std;
int num[101][101];

int rotation(int x1,int y1, int x2, int y2)
{
      //오른쪽으로 : x1은 고정, y1증가
    int tmp1=num[x1][y1];
    int tmp2=num[x1][y2];
    int tmp3=num[x2][y2];
    int tmp4=num[x2][y1];
    
    bool n[10002];
    for(int i=0;i<10002;i++)
        n[i]=false;
    n[num[x1][y1]]=true;
    n[num[x1][y2]]=true;
    n[num[x2][y2]]=true;
    n[num[x2][y1]]=true;
    
    
    for(int j=y2;j>y1;j--)
    {
        
        num[x1][j]=num[x1][j-1];
        n[num[x1][j-1]]=true;
        //cout<<num[x1][j-1]<<endl;
    }
    //아래로 : y2는 고정 , x1 증가
    for(int j=x2;j>x1;j--)
    {
        num[j][y2]=num[j-1][y2];
        n[num[j-1][y2]]=true;
    }
    //왼쪽으로 : x2는 고정 y2 감소
    for(int j=y1;j<y2;j++)
    {
        num[x2][j]=num[x2][j+1];
        n[num[x2][j+1]]=true;
    }
    //위로  : y1은 고정 x2 감소
    for(int j=x1;j<x2;j++)
    {
        num[j][y1]=num[j+1][y1];
        n[num[j+1][y1]]=true;
    }
    num[x1+1][y2]=tmp2;
    num[x2][y2-1]=tmp3;
    num[x2-1][y1]=tmp4;
    
    // cout<<num[x1][y1]<<endl;
    // cout<<num[x1][y2]<<endl;
    // cout<<num[x2][y2]<<endl;
    // cout<<num[x2][y1]<<endl;
    
    for(int i=1;i<10001;i++){
        if(n[i])
            return i;
    }
   
     return 0;
}

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    for(int i=1;i<=rows;i++)
        for(int j=1;j<=columns;j++)
            num[i][j]=(i-1)*columns+j;
    // for(int i=1;i<=rows;i++)
    // {  for(int j=1;j<=columns;j++)
    //        cout<< num[i][j];
    //  cout<<endl;
    // }
    
    int t=0;
    for(int i=0;i<queries.size();i++)
    {
        t=rotation(queries[i][0],queries[i][1],queries[i][2],queries[i][3]);
        answer.push_back(t);
    }
    
    return answer;
}

 

#include <string>
#include <vector>
#include<iostream>
using namespace std;
int num[101][101];

int rotation(int x1,int y1, int x2, int y2)
{
      //오른쪽으로 : x1은 고정, y1증가
    int tmp1=num[x1][y1];
    // int tmp2=num[x1][y2];
    // int tmp3=num[x2][y2];
    // int tmp4=num[x2][y1];
    
    bool n[10002];
    for(int i=0;i<10001;i++)
        n[i]=false;
    n[num[x1][y1]]=true;
    n[num[x1][y2]]=true;
    n[num[x2][y2]]=true;
    n[num[x2][y1]]=true;
    
     for(int j=x1;j<x2;j++)
    {
        num[j][y1]=num[j+1][y1];
        n[num[j][y1]]=true;
    }
     
    for(int j=y1;j<y2;j++)
    {
        num[x2][j]=num[x2][j+1];
        n[num[x2][j]]=true;
    }
    for(int j=x2;j>x1;j--)
    {
        num[j][y2]=num[j-1][y2];
        n[num[j][y2]]=true;
    }
    for(int j=y2;j>y1;j--)
    {
        
        num[x1][j]=num[x1][j-1];
        n[num[x1][j]]=true;
       
    }
   
   
   

   
    num[x1][y1+1]=tmp1;
   
    // for(int i=1;i<=11;i++)
    // {  for(int j=1;j<=11;j++)
    //        cout<< num[i][j];
    //  cout<<endl;
    // }
    // cout<<num[x1][y1]<<endl;
    // cout<<num[x1][y2]<<endl;
    // cout<<num[x2][y2]<<endl;
    // cout<<num[x2][y1]<<endl;
    
    for(int i=1;i<10001;i++){
        if(n[i])
            return i;
    }
   
     return 0;
}

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    for(int i=1;i<=rows;i++)
        for(int j=1;j<=columns;j++)
            num[i][j]=(i-1)*columns+j;
    // for(int i=1;i<=rows;i++)
    // {  for(int j=1;j<=columns;j++)
    //        cout<< num[i][j];
    //  cout<<endl;
    // }
    
    int t=0;
    for(int i=0;i<queries.size();i++)
    {
        t=rotation(queries[i][0],queries[i][1],queries[i][2],queries[i][3]);
        answer.push_back(t);
    }
    
    return answer;
}