반응형
const express = require('express');
const app = express();
const mongoose = require("mongoose");
const cors = require('cors');
const bodyParser = require('body-parser')
//Image Schema 이미지 데이터 스키마
const { Image } = require('./models/index.js');
const multer = require('multer')
// require('dotenv').config();

//DB 연결
mongoose.connect("mongodb://localhost:27017/image-test");
mongoose.connection.on("connected", () => {
    console.log("DB connect success");
})
mongoose.connection.on("error", (err) => {
    console.log(err);
})

//필요 middle-ware 연결
app.use(cors());
app.use(express.json());

//정적 파일 제공하기위한 static
//현재 '/imgaes' 의 디렉토리에 있는 정적 파일에 외부 접근을 허용한 상태
//추후 배포할 때 디렉토리 지정필요
app.use(express.static('/images'));


//req.body 사용하기 위한 bodyParser
app.use(bodyParser.json())
app.use(bodyParser.urlencoded())
app.use(bodyParser.urlencoded({ extended: true }));


app.get("/", (req, res) => {
    res.send("hello!");
})

//이미지를 저장할 서버 폴더 선택
//이미지 파일은 서버에서 저장하고 DB에는 이미지에 대한 메타태그만 저장!
var storage = multer.diskStorage({
    destination: (req, file, cb) => {
        // console.log("dest:", req);
        //서버컴퓨터의 /imgaes 디렉토리에 받은 파일 저장하겠다는 뜻
        cb(null, "/images");
    },
    filename: (req, file, cb) => {
        //파일 이름이 겹치는걸 막기 위해 Date 이용해서 구분
        cb(null, `${Date.now()}_${file.originalname}`);
    },
});

//"img" 는 클라이언트에서 보내는 요청 FORMDATA의 태그와 동일해야함
let upload = multer({ storage }).single("img");
// user가 이미지 업로드하는 요청
app.post("/upload", (req, res) => {
    console.log("req:", req);
    upload(req, res, (err) => {
        if (err) {
            return res.json({ success: false, err });
        }
        //client가 업로드하는 이미지 파일은 res.req.file 에 담긴다.
        //그외 client가 부가적으로 포함해 전송하는 데이터는 res.req.body에 담긴다.
        //이후에 client가 전송하는 이미지파일 + 사용자 id + .. 등등을 바탕으로 몽고db에 데이터 추가하는 것을 구현해야함
        return res.json({
            success: true,
            image: res.req.file.path,
            fileName: res.req.file.filename,
            type: JSON.parse(res.req.body.type),
            userId: res.req.body.userId,
        });
    });
});


app.listen(8010, () => {
    console.log('server open');
})
반응형

'node.js > Express.js' 카테고리의 다른 글

웹서버 운영  (0) 2022.08.04
server  (0) 2022.08.01
express + react 연결  (0) 2022.07.25
미들웨어, Router  (0) 2022.07.15
반응형
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const cors = require("cors");
const bodyParser = require("body-parser");
//Image Schema
const { Image } = require("./models/index.js");
const multer = require("multer");
// require('dotenv').config();

//DB 연결
// mongoose.connect("mongodb://localhost:27017/image-test");
// mongoose.connection.on("connected", () => {
//     console.log("DB connect success");
// })
// mongoose.connection.on("error", (err) => {
//     console.log(err);
// })

//필요 middle-ware 연결
app.use(cors());
app.use(express.json());

//정적 파일 제공하기위한 static
//app.use(express.static('/images'));
app.use(express.static("images"));
//req.body 사용하기 위한 bodyParser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(bodyParser.urlencoded({ extended: true }));

app.get("/", (req, res) => {
  res.send("hello!");
});

//client가 image upload (post)요청 하면
//client가 준 데이터를 받아서 mongoDB에 저장

//이미지를 저장할 서버 폴더 선택
//이미지 파일은 서버에서 저장하고 DB에는 이미지에 대한 메타태그만 저장!
// 지금은 빌드 내부의 디렉토리에 저장하고 있는데 빌드 내부 디렉토리에 저장하는 것이 아닌 서버의 루트 디렉토리를 통한 경로를 지정해주어야함
// %루트 디렉토리 -> 권한 문제 % ?
var storage = multer.diskStorage({
  destination: (req, file, cb) => {
    // console.log("dest:", req);
    //서버의 uploads 디렉토리에 받은 파일 저장하겠다는 뜻
    cb(null, "images");
  },
  filename: (req, file, cb) => {
    //파일 이름이 겹치는걸 막기 위해 Date 이용해서 구분
    cb(null, `${Date.now()}_${file.originalname}`);
  },
});

//"img" 는 클라이언트에서 보내는 요청과 동일해야함
let upload = multer({ storage }).single("img");

// user가 이미지 업로드하는 요청
app.post("/upload", (req, res) => {
  //   console.log("req:", req);
  upload(req, res, (err) => {
    if (err) {
      return res.json({ success: false, err });
    }
    return res.json({
      success: true,
      image: res.req.file.path,
      fileName: res.req.file.filename,
      type: JSON.parse(res.req.body.type),
      userId: res.req.body.userId,
    });
  });
});

app.get("/users/:id", (req, res) => {
  const { id } = req.params;
  console.log(id);

  //해당 img url 전송
  const urls = [
    {
      id: 1,
      src: "http://localhost:8010/1659281197154_top2.jpg",
      type: "top",
      userId: "1234",
    },
    {
      id: 2,
      src: "data:image/jpeg;base64,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",
      type: "top",
    },
    { id: 3, src: "http://localhost:8010/1659281197154_top2.jpg", type: "top" },
    { id: 4, src: "http://localhost:8010/1659281197154_top2.jpg", type: "top" },
    { id: 5, src: "http://localhost:8010/1659281197154_top2.jpg", type: "top" },
    { id: 6, src: "http://localhost:8010/1659281197154_top2.jpg", type: "top" },
    { id: 7, src: "http://localhost:8010/1659281197154_top2.jpg", type: "top" },
    { id: 8, src: "http://localhost:8010/1659281197154_top2.jpg", type: "top" },
    { id: 9, src: "http://localhost:8010/1659281197154_top2.jpg", type: "top" },
    {
      id: 10,
      src: "http://localhost:8010/1659281197154_top2.jpg",
      type: "top",
    },

    { id: 11, src: "http://localhost:8010/shoe1.jpg", type: "shoe" },
    { id: 12, src: "http://localhost:8010/shoe1.jpg", type: "shoe" },
    { id: 13, src: "http://localhost:8010/shoe1.jpg", type: "shoe" },
    { id: 14, src: "http://localhost:8010/shoe1.jpg", type: "shoe" },
    { id: 15, src: "http://localhost:8010/shoe1.jpg", type: "shoe" },
    { id: 16, src: "http://localhost:8010/shoe1.jpg", type: "shoe" },
    { id: 17, src: "http://localhost:8010/shoe1.jpg", type: "shoe" },
    { id: 18, src: "http://localhost:8010/bot1.jpg", type: "bot" },
    { id: 19, src: "http://localhost:8010/bot1.jpg", type: "bot" },
    { id: 20, src: "http://localhost:8010/bot1.jpg", type: "bot" },
    { id: 21, src: "http://localhost:8010/bot1.jpg", type: "bot" },
    { id: 22, src: "http://localhost:8010/bot1.jpg", type: "bot" },
    { id: 23, src: "http://localhost:8010/bot1.jpg", type: "bot" },
    { id: 24, src: "http://localhost:8010/bot1.jpg", type: "bot" },
    {
      id: 25,
      src: "data:image/png;base64,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",
      type: "what",
    },
    {
      id: 26,
      src: "data:image/png;base64,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",
      type: "what",
    },
    {
      id: 27,
      src: "data:image/png;base64,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",
      type: "what",
    },
    {
      id: 28,
      src: "data:image/png;base64,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",
      type: "what",
    },
  ];
  res.send(urls);
});

app.listen(8010, () => {
  console.log("server open");
});
반응형

'node.js > Express.js' 카테고리의 다른 글

웹서버 운영  (0) 2022.08.04
node.js 서버에서 client와 이미지 파일 주고 받는 api 구현  (0) 2022.08.02
express + react 연결  (0) 2022.07.25
미들웨어, Router  (0) 2022.07.15
반응형

https://www.acmicpc.net/problem/21608

 

21608번: 상어 초등학교

상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;

int N, num, seat[21][21], student[401][4];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

bool isInLikeStudent(int cur, int x, int y) {
  for (int i = 0; i < 4; i++) {
    if (student[cur][i] == seat[x][y])
      return true;
  }
  return false;
}

void sitDownOneByOne(int cur) {
  int resX = -1, resY = -1;
  //여기가 중요한 포인트! 0 / 0인 경우가 정답이 될 수 있다
  int maxLikeStudents = -1, maxEmpties = -1;

  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      int likeStudents = 0;
      int empty = 0;

      if (seat[i][j] > 0)
        continue;
      for (int k = 0; k < 4; k++) {
        int nx = i + dx[k];
        int ny = j + dy[k];
        if (nx <= 0 || nx > N || ny <= 0 || ny > N)
          continue;
        if (seat[nx][ny] == 0) {
          empty++;
        } else if (isInLikeStudent(cur, nx, ny)) {
          likeStudents++;
        }
      }

      if (likeStudents > maxLikeStudents) {
        maxLikeStudents = likeStudents;
        maxEmpties = empty;
        resX = i;
        resY = j;
      } else if (likeStudents == maxLikeStudents) {
        if (empty > maxEmpties) {
          maxEmpties = empty;
          resX = i;
          resY = j;

        } else if (empty == maxEmpties) {
          if (resX == i && resY > j) {
            resY = j;
          } else if (resX > i) {
            resX = i;
            resY = j;
          }
        }
      }
    }
  }

  seat[resX][resY] = cur;
}

void Input() {
  cin >> N;
  num = N * N;
  for (int i = 1; i <= num; i++) {
    int cur;
    cin >> cur;
    for (int j = 0; j < 4; j++) {
      cin >> student[cur][j];
    }
    sitDownOneByOne(cur);
  }
}

int calAns() {
  int ans = 0;
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {

      int myFriends = 0;
      for (int k = 0; k < 4; k++) {
        int nx = i + dx[k];
        int ny = j + dy[k];

        if (nx <= 0 || nx > N || ny <= 0 || ny > N)
          continue;
        if (isInLikeStudent(seat[i][j], nx, ny)) {
          myFriends++;
        }
      }
      if (myFriends == 1) {
        ans += 1;
      } else if (myFriends == 2) {
        ans += 10;
      } else if (myFriends == 3) {
        ans += 100;
      } else if (myFriends == 4) {
        ans += 1000;
      }
    }
  }

  return ans;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  Input();
  cout << calAns() << '\n';

  return 0;
}
반응형
반응형

https://www.acmicpc.net/problem/20058

 

20058번: 마법사 상어와 파이어스톰

마법사 상어는 파이어볼과 토네이도를 조합해 파이어스톰을 시전할 수 있다. 오늘은 파이어스톰을 크기가 2N × 2N인 격자로 나누어진 얼음판에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c

www.acmicpc.net

#include <bits/stdc++.h>

using namespace std;

int N,rows, Q,L, A[64][64];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

void TurnBox(int x, int y, int len){
    int retBox[len][len];

    for(int i=0; i<len; i++) {
        for (int j = 0; j < len; j++) {
            retBox[j][len-1-i] = A[x+i][y+j];
        }
    }

    for(int i=0; i<len; i++) {
        for (int j = 0; j < len; j++) {
            A[x+i][y+j] = retBox[i][j];
        }
    }

}


void Turn(int _L){
    int box = pow(2,N) / pow(2, _L);
    int len = pow(2,_L);

    for(int i=0; i<box ;i++){
        for(int j=0; j<box; j++) {
            int x = i*len;
            int y = j*len;

            TurnBox(x,y,len);
        }
    }
}

void Melt(){
    vector<pair<int,int> > willMelt;

    for(int i=0; i<rows; i++){
        for(int j=0; j<rows; j++){
            int cnt = 0;
            if(A[i][j]==0) continue;
            for(int k=0; k<4; k++){
                int nx = i + dx[k];
                int ny= j +dy[k];
                if(nx<0||nx>=rows||ny<0||ny>=rows) continue;
                if(A[nx][ny] > 0) cnt++;
            }
            if(cnt <3){
                willMelt.push_back({i,j});
            }
        }
    }

    for(int i=0; i<willMelt.size();i++){
        A[willMelt[i].first][willMelt[i].second]--;
    }
}

void Round(int _L){
    Turn(_L);
    Melt();
}


void Input();
int Count(){
    int sum = 0;
    for(int i=0; i<rows; i++){
        for(int j=0; j<rows; j++){
            sum += A[i][j];
        }
    }
    return sum;
}

int getMax(){
    bool ch[64][64] = {0};
    int ans = 0;
    queue<pair<int,int> > Q;

    for(int i=0; i<rows; i++){
        for(int j=0; j<rows; j++){
            if(!ch[i][j] && A[i][j]>0){
                ch[i][j] = 1;
                int cnt = 1;
                Q.push({i,j});

                while(!Q.empty()){
                    auto cur = Q.front(); Q.pop();

                    for(int k=0; k<4; k++){
                        int nx = cur.first + dx[k];
                        int ny= cur.second +dy[k];
                        if(nx<0||nx>=rows||ny<0||ny>=rows) continue;
                        if(ch[nx][ny] || A[nx][ny]==0) continue;
                        Q.push({nx,ny});
                        ch[nx][ny] = 1;
                        cnt++;

                    }
                }

                ans = max(ans, cnt);
            }
        }
    }


    return ans;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    Input();
    cout << Count() << '\n';
    cout << getMax() << '\n';

}

void Input() {
    cin >> N >> Q;
    rows = pow(2,N);
    for(int i=0; i<rows; i++){
        for(int j=0; j<rows; j++){
            cin >> A[i][j];
        }
    }
    for(int i=0; i<Q; i++){
        cin >> L;
        Round(L);
    }
}
반응형
반응형
https://www.acmicpc.net/problem/20057
 

20057번: 마법사 상어와 토네이도

마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을

www.acmicpc.net

1.문제설명

토네이도의 이동 방법은 단순 반복이기 때문에

반복문으로 구현할 수 있다.

 

토네이도에 따라 모래가 이동하는 것을 잘 구현해야 한다.

항상 모래가 퍼지는 방법은 동일한데

토네이도의 이동방향에 따라 다르다.

 

토네이도의 이동방향을 기준으로

현재 이동방향과 수직에 놓여있는지,

아니면 현재 이동방향의 2칸 앞에 있는지

현재 토네이도가 이동한 위치와 이동했던 방향을 기준으로

함수를 만들면 4방향에 대해서 모두 처리해주지 않아도 된다.

 

 

 

2.문제풀이코드 C++

#include <bits/stdc++.h>

using namespace std;

int N, sum, sand[500][500];

void Input();


int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};

bool inSand(int x, int y) {
    return (x >= 1 && x <= N && y >= 1 && y <= N);
}

void flySand(int x, int y, int dir) {
    int nx = x + dx[dir] * 2;
    int ny = y + dy[dir] * 2;
    int sum = 0;

    int num = int(sand[x][y] * 0.05);
    sum += num;
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }

    //수직

    num = int(sand[x][y] * 0.07);
    sum += num;
    nx = x + dx[(dir + 1) % 4];
    ny = y + dy[(dir + 1) % 4];
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }


    num = int(sand[x][y] * 0.07);
    sum += num;
    nx = x + dx[(dir + 3) % 4];
    ny = y + dy[(dir + 3) % 4];
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }


    num = int(sand[x][y] * 0.02);
    sum += num;
    nx = x + dx[(dir + 1) % 4] * 2;
    ny = y + dy[(dir + 1) % 4] * 2;
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }


    num = int(sand[x][y] * 0.02);
    sum += num;
    nx = x + dx[(dir + 3) % 4] * 2;
    ny = y + dy[(dir + 3) % 4] * 2;
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }


    //수직

    num = int(sand[x][y] * 0.1);
    sum += num;
    nx = x + dx[(dir + 1) % 4] + dx[dir];
    ny = y + dy[(dir + 1) % 4] + dy[dir];
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }


    num = int(sand[x][y] * 0.1);
    sum += num;
    nx = x + dx[(dir + 3) % 4] + dx[dir];
    ny = y + dy[(dir + 3) % 4] + dy[dir];
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }


    //수직\

    num = int(sand[x][y] * 0.01);
    sum += num;
    nx = x + dx[(dir + 1) % 4] - dx[dir];
    ny = y + dy[(dir + 1) % 4] - dy[dir];
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }


    num = int(sand[x][y] * 0.01);
    sum += num;
    nx = x + dx[(dir + 3) % 4] - dx[dir];
    ny = y + dy[(dir + 3) % 4] - dy[dir];
    if (inSand(nx, ny)) {
        sand[nx][ny] += num;
    }

    nx = x + dx[dir];
    ny = y + dy[dir];
    if (inSand(nx, ny)) {
        sand[nx][ny] += sand[x][y] - sum;
    }

    sand[x][y] = 0;

}


void tornadoMove() {
    int x = N / 2 + 1, y = N / 2 + 1;
    int dir = 0;
    int moveBlocks = 1;
    int cnt = 0;

//    while(!(x==1 && y==1)){
    while (1) {
        for (int i = 0; i < moveBlocks; i++) {
            x += dx[dir];
            y += dy[dir];
            flySand(x, y, dir);

            if (x == 1 && y == 1) return;
        }
        cnt++;
        dir = (dir + 1) % 4;
        if (cnt == 2) {
            moveBlocks++;
            cnt = 0;
        }

    }
}


int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);


    Input();
    tornadoMove();

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            sum -= sand[i][j];
        }
    }

    cout << sum << '\n';
}

void Input() {
    cin >> N;

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            cin >> sand[i][j];
            sum += sand[i][j];
        }
    }
}
반응형
반응형

https://www.acmicpc.net/problem/20056

 

20056번: 마법사 상어와 파이어볼

첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치

www.acmicpc.net

1. 문제설명

구현함에 있어서 문제의 단계를 꼼꼼히 보아야하는 문제

각 파이어볼이 모두 이동한 후에 합쳐져야 하므로

현재 배열에 존재하는 파이어볼을 기준으로

새로운 배열에 파이어볼의 이동을 담아야한다.

 

 

 

2.문제풀이코드 C++

#include <bits/stdc++.h>

using namespace std;
int N, M, K;

struct fireBall {
    int m, s, d;
};

int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};

vector<fireBall> arr[51][51];
void Input();

void move() {
    vector<fireBall> nextState[51][51];
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (arr[i][j].size() > 0) {
                for (auto k: arr[i][j]) {
                    int nx = (i + dx[k.d] * k.s) % N;
                    int ny = (j + dy[k.d] * k.s) % N;
                    if (nx <= 0) nx += N;
                    if (ny <= 0) ny += N;
                    nextState[nx][ny].push_back({k.m, k.s, k.d});
                }
            }
        }
    }

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (nextState[i][j].size() > 1) {
                int sumM = 0;
                int sumS = 0;
                bool dirSame = true;
                int dir = nextState[i][j][0].d % 2;
                for (auto k: nextState[i][j]) {
                    if (k.d % 2 != dir) {
                        dirSame = false;
                    }
                    sumS += k.s;
                    sumM += k.m;
                }

                int newM = sumM / 5;
                int newS = sumS / nextState[i][j].size();

                //new fireball 4
                nextState[i][j].clear();
                if (newM <= 0) continue;

                int newDir = 0;
                if (!dirSame) newDir = 1;

                for (int k = 0; k < 4; k++) {
                    nextState[i][j].push_back({newM, newS, newDir});
                    newDir += 2;
                }
            }
        }
    }
    swap(nextState, arr);
}


int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    Input();
    for (int i = 0; i < K; i++) {
        move();
    }

    int ans = 0;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            for (auto k: arr[i][j]) {
                ans += k.m;
            }
        }
    }
    cout << ans << '\n';
}

void Input() {
    cin >> N >> M >> K;
    for (int i = 0; i < M; i++) {
        int r, c, m, d, s;
        cin >> r >> c >> m >> s >> d;
        arr[r][c].push_back({m, s, d});
    }
}

 

반응형
반응형

react build한 후 html 파일을

res.sendFile 해주면 된다

 

const express = require('express')
const app = express()
const path = require('path')

app.listen(8030, function () {
    console.log('listening on 8030')
})

app.use(express.static(path.join(__dirname, 'prac/build')));

app.get('/', function (req, res) {
    res.sendFile(path.join(__dirname, 'prac/build/index.html'));
})
반응형

'node.js > Express.js' 카테고리의 다른 글

웹서버 운영  (0) 2022.08.04
node.js 서버에서 client와 이미지 파일 주고 받는 api 구현  (0) 2022.08.02
server  (0) 2022.08.01
미들웨어, Router  (0) 2022.07.15
반응형

https://www.acmicpc.net/problem/20055

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

1. 문제설명

벨트가 회전함에 따라

각 벨트 번호의 내구도가 한칸씩 옮겨지고 로봇또한 한칸씩 옮겨지는 것을 구현하고,

벨트위에 있는 로봇을 옮길 수 있는지 확인한 후 한 칸씩 옮기는 것을 구현해야하는 문제이다.

 

이를 구현하기 위해

벨트의 번호에 따른 내구도를 나타내는 배열을 만들고

벨트의 번호에 따라 로봇이 있는지 여부를 나타내는 배열을 만들어서

회전시키는 것을 구현하면 된다.

 

단순 회전은 큐를 이용하면 쉽겠지만

이 문제에서는 각 로봇에 대해 접근을 해야하기 때문에

차라리 배열을 이용하는 것이 괜찮은 것 같다.

큐를 이용하면 회전을 빠르게 구현 할 수 있겠지만

결국 각 벨트 번호에 대한 로봇의 여부를 구하기 위해 인덱스접근하는데 O(n)이 필요하기 떄문이다.

 

 

2.문제풀이코드 C++

#include <bits/stdc++.h>

using namespace std;
int N, K;
void Input();

int durability[202];
bool robots[101];


void beltRotate(){
    int beltLast = durability[2*N];
    for(int i=2*N; i>1; i--){
        durability[i] = durability[i-1];
    }
    durability[1] = beltLast;

    for(int i=N; i>=1; i--){
        robots[i] = robots[i-1];
    }
    robots[N] = 0;


    for(int i=N-1; i>=1; i--){
        if(robots[i]){
            if(durability[i+1] > 0 && !robots[i+1]){
                durability[i+1]--;
                robots[i+1] = 1;
                robots[i] = 0;

                if(i+1 ==N) robots[i+1] =0;
            }
        }
    }

    if(durability[1] > 0){
        robots[1] = 1;
        durability[1]--;
    }
}

bool check(){
    int cnt = 0;
    for(int i=1; i<=2*N; i++){
        if(durability[i]==0){
            cnt++;
        }
    }

    return cnt >= K;
}


int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    Input();

    int turn = 1;
    while(1){
        beltRotate();
        if(check()){
            cout << turn << '\n';
            return 0;
        }
        turn++;
    }
}



void Input() {
    cin >> N >> K;
    for(int i=1; i<=2*N; i++){
        cin >> durability[i];
    }
}
반응형

+ Recent posts