되면한다

프로그래머스. 행렬 테두리 회전하기 (구현) 본문

코딩테스트준비

프로그래머스. 행렬 테두리 회전하기 (구현)

haeullee 2023. 7. 7. 22:23

https://school.programmers.co.kr/learn/courses/30/lessons/77485

 

프로그래머스

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

programmers.co.kr

왼쪽위, 오른쪽아래 좌표가 들어온다. 이를 테두리로 하여, 행렬을 시계 방향으로 돌린다.  

인덱스값을 잘 지정해야하는 구현 문제이다. 특별한 알고리즘, 자료구조는 필요하지 않다. 

 

1. 특징

1) 인덱스 관련 구현

 

2. 삽질 포인트

1) 회전 과정에서 이미 값을 덮어버린 좌표값이 새로운 좌표값의 값으로 들어가게 설정하는 등의 실수들이 있어서 시간이 오래걸렸다. 

대입할 좌표는 그대로 두고, 가져올 좌표값을 i나 j로 변경한다.

(ex. board[curx][j] = board[curx][j-1];)

 

3. 코드

#include <string>
#include <vector>
#include <iostream>
#include <limits.h>
using namespace std;
int board[102][102];
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    int cnt = 1;
    for(int i = 1; i < rows + 1; i++)
    {
        for(int j = 1; j < columns + 1; j++)
        {
            board[i][j] = cnt++;
        }
    }
    
    for(int k = 0; k < queries.size(); k++)
    {
        int curx = queries[k][0];
        int cury = queries[k][1];
        int curx1 = queries[k][2];
        int cury1 = queries[k][3];

        int tmp1 = board[curx][cury1];
        int tmp2 = board[curx1][cury];
   
        for(int j = cury1; j > cury; j--)
        {
            board[curx][j] = board[curx][j-1];
    
        }
        
        for(int j = cury; j < cury1; j++)
        {
            board[curx1][j] = board[curx1][j+1];
  
        }
    
        for(int i = curx; i < curx1; i++)
        { 
            if(i == curx1 - 1) board[i][cury] = tmp2;
            else board[i][cury] = board[i+1][cury];
        
        }
        
        for(int i = curx1; i > curx; i--)
        {
            if(i == curx + 1) board[i][cury1] = tmp1;
            else board[i][cury1] = board[i-1][cury1];
     
        }

        int mn = INT_MAX;
        for(int j = cury; j <= cury1; j++)
        {
            mn = min(mn, board[curx][j]);
        }
        
        for(int j = cury; j <= cury1; j++)
        {
            mn = min(mn, board[curx1][j]);
        }
        
        for(int i = curx; i <= curx1; i++)
        {
            mn = min(mn, board[i][cury]);
        }
        
        for(int i = curx; i <= curx1; i++)
        {
            mn = min(mn, board[i][cury1]);
        }
            
        answer.push_back(mn);
        
    }
    
    return answer;
}
Comments