반응형

git에서 프로젝트를 클론 후 STS로 프로젝트를 열었다.

 

그런데 첫줄에 에러 표시가 있었다!!!...

 

뭐지.. 그냥 가져왔을 뿐인데 에러가 나길래 당황 ㅜ ㅜ

 

하지만 갓글링을 통해 여러가지 방법을 찾아보고 시도했다.

 

먼저 이런 오류가 발생하는 원인은 Eclipse에서 나타나는 버그로 maven이 jar 들을 다운 받으면서 도중에 멈추거나 꼬인 것이라고 한다.

 

1. 해당프로젝트 우클릭 -> Maven -> Update Project

이렇게 하면 해결 된다는 글을 보았지만 내 경우에는 에러가 그대로 남아있었다.

 

2. porm.xml 에서 spring-boot-stater-parent의 version을 변경 (이 방법으로 해결!)

 

처음엔 아래 코드로 되어 있었다.

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.5.RELEASE</version>
</parent>

아래 코드로 변경 후, 저장을 해서 다시 빌드! 하니 오류가 해결됐다.

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.4.RELEASE</version>
</parent>

 

3. 해당 프로젝트 우클릭 -> Maven -> Update project 로 들어가서

일부만 캡쳐

해당 프로젝트 체크 후 아래 부분은 위 사진과 같이 체크 후 OK.

 

4. porm.xml에서 

<properties>
	<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    <java.version>1.8</java.version>
</properties>

위와같은 properties를 찾고 메이븐 플러그인을 다운그레이드 한 후 

다시 프로젝트 우클릭 -> Maven ->Update 해주면 해결 된다고 한다.

나는 1,3,4 번을 먼저 시도했지만 안됐고, 2번을 통해 해결했다!

반응형
반응형

감시 성공

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 512 MB 12616 5304 3121 38.785%

문제

스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감시할 수 있는 방법은 다음과 같다.

         
1번 2번 3번 4번 5번

1번 CCTV는 한 쪽 방향만 감시할 수 있다. 2번과 3번은 두 방향을 감시할 수 있는데, 2번은 감시하는 방향이 서로 반대방향이어야 하고, 3번은 직각 방향이어야 한다. 4번은 세 방향, 5번은 네 방향을 감시할 수 있다.

CCTV는 감시할 수 있는 방향에 있는 칸 전체를 감시할 수 있다. 사무실에는 벽이 있는데, CCTV는 벽을 통과할 수 없다. CCTV가 감시할 수 없는 영역은 사각지대라고 한다.

CCTV는 회전시킬 수 있는데, 회전은 항상 90도 방향으로 해야 하며, 감시하려고 하는 방향이 가로 또는 세로 방향이어야 한다.

0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0

지도에서 0은 빈 칸, 6은 벽, 1~5는 CCTV의 번호이다. 위의 예시에서 1번의 방향에 따라 감시할 수 있는 영역을 '#'로 나타내면 아래와 같다.

       

CCTV는 벽을 통과할 수 없기 때문에, 1번이 → 방향을 감시하고 있을 때는 6의 오른쪽에 있는 벽을 감시할 수 없다.

0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 6 0 0 6 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5

위의 예시에서 감시할 수 있는 방향을 알아보면 아래와 같다.

       
왼쪽 상단 2: ↔, 오른쪽 하단 2: ↔ 왼쪽 상단 2: ↔, 오른쪽 하단 2: ↕ 왼쪽 상단 2: ↕, 오른쪽 하단 2: ↔ 왼쪽 상단 2: ↕, 오른쪽 하단 2: ↕

CCTV는 CCTV를 통과할 수 있다. 아래 예시를 보자.

0 0 2 0 3 0 6 0 0 0 0 0 6 6 0 0 0 0 0 0

위와 같은 경우에 2의 방향이 ↕ 3의 방향이 ←와 ↓인 경우 감시받는 영역은 다음과 같다.

# # 2 # 3 0 6 # 0 # 0 0 6 6 # 0 0 0 0 #

사무실의 크기와 상태, 그리고 CCTV의 정보가 주어졌을 때, CCTV의 방향을 적절히 정해서, 사각 지대의 최소 크기를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 사무실의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 8)

둘째 줄부터 N개의 줄에는 사무실 각 칸의 정보가 주어진다. 0은 빈 칸, 6은 벽, 1~5는 CCTV를 나타내고, 문제에서 설명한 CCTV의 종류이다. 

CCTV의 최대 개수는 8개를 넘지 않는다.


 

이 문제는 모든 것을 다 해보는 부르트포스 알고리즘이다. 그냥 완전 탐색!

알고리즘

pair<int,int> lo[4] 배열은 '북','동','남','서' 의 값을 저장해 놓고, CCTV가 바라보는 방향에 따라 CCTV 위치에 행과 열값을 더해주면서 감시 구역을 체크하는데 이용한다.

  1. CCTV의 위치를 vector에 저장한다.
  2.  vector<int> cctv[6]; 배열에 CCTV 별로 감시 방향의 번호를 저장
    1. 0 > 북 , 1 > 동 , 2 > 남 , 3 > 서
  3. 다음을 CCTV 개수 만큼 재귀 수행 한다.
    1. cctv의 번호를 가져와 몇번의 회전이 있는지 int spin에 저장
    2. 0~spin 만큼 다음을 반복 (0~spin을 cctv[cnum]에 더하는 이유는 오른쪽으로 90도를 회전하는 것 때문)
    3. 기존의 2차원 배열(맵),과 현재 사각지대의 개수를 복사한다
    4. CCTV를 회전시키며 map 배열에 체크하며 사각지대의 개수를 감소시킨다.
      1. 벽이면 취소
      2. 이미 감시구역이거나 CCTV가 있는 자리면 사각지대를 감소하지 않고 좌표만 이동
    5. 재귀
    6. 복사해둔 map과 사각지대의 개수를 다시 복사.

 

코드

#include<iostream>
#include<vector>
using namespace std;
int N, M, C,res,ans=1000000;
int map[8][8];
pair<int, int> lo[4] = { {-1,0},{0,1},{1,0},{0,-1} };
vector<pair<int, int>> v;
vector<int> cctv[6];
void copymap(int (*a)[8],int (*b)[8]) {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			a[i][j] = b[i][j];
		}
	}
	return;
}
void dfs(int idx) {

	if (idx >= C) {
		if (ans > res) {
			ans = res;
		}
		return;
	}
	int cr = v[idx].first, cc = v[idx].second;
	int spin = 0;
	int cnum = map[cr][cc];
	spin = cnum == 1 ? 4 : (cnum == 2 ? 2 : (cnum == 3 ? 4 : cnum == 4 ? 4 : 1));
	
	for (int i = 0; i < spin; i++) {
		int temp[8][8];
		int restemp = res;
		copymap(temp, map);
		for (int j = 0; j < cctv[cnum].size(); j++) {
			
			int lonum = cctv[cnum][j] + i >3 ? cctv[cnum][j]+i-4 : cctv[cnum][j] + i;
			int r = cr+lo[lonum].first;
			int c = cc+lo[lonum].second;
			while (r < N&&c < M&&r >= 0 && c >= 0 && map[r][c] != 6) {
				if (map[r][c]==0) {
					map[r][c] = -1;
					res--;
				}
				r += lo[lonum].first;
				c += lo[lonum].second;
			}
			
		}
		dfs(idx + 1);
		copymap(map, temp);
		res = restemp;
	}
}
int main() {
	
	cin >> N >> M;
	res = N * M;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> map[i][j];
			if (map[i][j] != 0 && map[i][j] != 6) {
				v.push_back({ i,j });
			}
			if (map[i][j] != 0) {
				res--;
			}
		}
	}
	C = v.size();
	cctv[1] = { 1};
	cctv[2] = { 1,3 };
	cctv[3] = { 0,1 };
	cctv[4] = { 0,1,3 };
	cctv[5] = { 0,1,2,3};
	dfs(0);
	cout << ans << endl;
}
반응형
반응형

주사위 굴리기 성공

시간 제한메모리 제한제출정답맞은 사람정답 비율

2 초 512 MB 16699 6652 4732 40.286%

문제

크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 이 지도의 위에 주사위가 하나 놓여져 있으며, 주사위의 전개도는 아래와 같다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 

2 4 1 3 5 6

주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다. 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.

지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.

주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 쓰여 있는 값을 구하는 프로그램을 작성하시오.

주사위는 지도의 바깥으로 이동시킬 수 없다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다.

입력

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.

둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다.

마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.

출력

이동할 때마다 주사위의 윗 면에 쓰여 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다.


이 문제는 삼성 SW역량 테스트에 나왔던 기출 문제이다.

그런데 난이도는 그렇게 높지 않은 문제라고 생각한다. 단순히 문제를 이해하고 그대로 구현하는 시뮬레이션 이다.

 

알고리즘

  1. 1.동서남북에 따라 주사위의 위치(x,y)와 값을 변경한다.
  2. 2.지도의 상태에 따라 동작
    1. 새로운 주사위 위치의 지도값이 0이면 주사위 바닥값을 지도에 옮긴다.
    2. 바닥값이 0이아닐 경우 주사위 바닥에 값을 옮긴 후 지도의 값을 0으로 만든다

위 순서에 따라 구현하면 쉽게 구현할 수 있다.

 

 

후기

이 문제를 보고 동 서 남 북에 따라 주사위 약도의 값이 어디로 이동하는지 노트에 그려보면서 풀었고, 쉽게 풀렸다 ㅎㅎ

 

코드

 

 

#include<iostream>

using namespace std;

int N, M, x, y, K;
int map[21][21];
int rl[] = { 0,0,0,-1,1 }; // 인덱스 1부터 동 서 북 남
int cl[] = { 0,1,-1,0,0 };// 인덱스 1부터 동 서 북 남
int val[7] = { 0, }; //3이 위 6이 아래
int main() {
	cin >> N >> M >> x >> y >> K;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> map[i][j];
		}
	}
	for (int i = 0; i < K; i++) {
		int move = 0;
		cin >> move;
		int newx = x+rl[move];
		int newy = y+cl[move];
		if (newx < 0 || newy < 0 || newx >= N || newy >= M) continue;
		int temp = 0;
		if (move == 1) {
			temp=val[3];
			val[3] = val[2];
			val[2] = val[6];
			val[6] = val[4];
			val[4] = temp;
		}
		else if (move == 2) {
			temp = val[6];
			val[6] = val[2];
			val[2] = val[3];
			val[3] = val[4];
			val[4] = temp;
		}
		else if (move == 3) {
			temp = val[6];
			val[6] = val[1];
			val[1] = val[3];
			val[3] = val[5];
			val[5] = temp;
		}
		else {
			temp = val[3];
			val[3] = val[1];
			val[1] = val[6];
			val[6] = val[5];
			val[5] = temp;
		}
		if (map[newx][newy] == 0) {
			map[newx][newy] = val[6];
		}
		else {
			val[6] = map[newx][newy];
			map[newx][newy] = 0;
		}
		cout << val[3]<<endl;
		x = newx;
		y = newy;
	}
}

 

 

반응형
반응형

원래 살던 곳에 2002년에 이사를 와서 이번에 동탄2신도시로 17년만에 이사를 오게 되었다!

 

새집을 가는게 너무 오랜만이라 많이 설레였다. ㅎㅎㅎ

 

이사를 하던 날 비가 오는 바람에 이삿짐 센터 직원 분들께서 고생을 많이 하셨다ㅜ ㅜ 

 

이사를 오면서 오래된 가구, 옷 등등 정말 많은 것을 버렸다.

 

세월이 흐른 만큼 어릴 때 사용하던 것들이 이제는 필요 없어지게 되었고, 많이 버리게 되었다.

 

새집 이라는 점이 좋았고, 전에 살던 집 보다는 평수가 적지만 구조가 좋아서 훨씬 넓어 보였다.

 

아쉬운 점은 주변에 친구가 없고, 아직 개발이 덜 되어 있어 카페, 코인노래방, 등등 여가를 즐기려면 버스를 타고

 

멀리 나가야 된다는 점이다... ㅜ ㅜ 편의점도 좀 가야 있고..

 

맨날 가던 스터디 카페도 없어서 집에만 있어야 되니 먼가 가슴이 답답하고 우울? 해지는 것 같다..

 

 

반응형

'일상~' 카테고리의 다른 글

SQLD 공부 방법&책(광고X)  (0) 2023.02.21
SI기업 입사한지 50일...  (0) 2020.01.28
[금연 하자 금연!] 몬스터 엑스팟 v2  (0) 2019.08.10
[영화 사자] 혼영 ~ /사자 후기  (0) 2019.08.06
후우.. 정신을 강하게~!~!~!~!  (0) 2019.07.11
반응형

문제

명우는 홍준이와 함께 팰린드롬 놀이를 해보려고 한다.

먼저, 홍준이는 자연수 N개를 칠판에 적는다. 그 다음, 명우에게 질문을 총 M번 한다.

각 질문은 두 정수 S와 E로 나타낼 수 있으며, S번째 수부터 E번째 까지 수가 팰린드롬을 이루는지를 물어보며, 명우는 각 질문에 대해 팰린드롬이다 또는 아니다를 말해야 한다.

예를 들어, 홍준이가 칠판에 적은 수가 1, 2, 1, 3, 1, 2, 1라고 하자.

  • S = 1, E = 3인 경우 1, 2, 1은 팰린드롬이다.
  • S = 2, E = 5인 경우 2, 1, 3, 1은 팰린드롬이 아니다.
  • S = 3, E = 3인 경우 1은 팰린드롬이다.
  • S = 5, E = 7인 경우 1, 2, 1은 팰린드롬이다.

자연수 N개와 질문 M개가 모두 주어졌을 때, 명우의 대답을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 N (1 ≤ N ≤ 2,000)이 주어진다.

둘째 줄에는 홍준이가 칠판에 적은 수 N개가 순서대로 주어진다. 칠판에 적은 수는 100,000보다 작거나 같은 자연수이다.

셋째 줄에는 홍준이가 한 질문의 개수 M (1 ≤ M ≤ 1,000,000)이 주어진다.

넷째 줄부터 M개의 줄에는 홍준이가 명우에게 한 질문 S와 E가 한 줄에 하나씩 주어진다.

출력

총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.

 

 


 

 

먼저 팰린드롬이 무엇인지 알아보자.

 - 팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 단어를 뜻한다. 예를들어 aoa pop 같은게 팰린드롬이다.

 

이 문제에서는 숫자로 적용하였으므로 121 , 2332 같은 것이 팰린드롬이 되겠다.

 

 

 

풀이

개념은 간단하다. 하지만 시간을 줄이는 것이 관건 이므로 dp를 사용했다.

 

1 2 1 3 1 2 1 을 예로 들어 보자.(가장 앞 인덱스를 1 마지막 인덱스를 7)

 

i는 시작 인덱스 , j는 끝 인덱스 라고 정한다.

 

<1개의 숫자>

i와 j가 같다면 팰린드롬이다. 즉, 하나의 숫자만 있다면 그것은 팰린드롬이다.

 

<2개의 숫자>

숫자가 2개이므로 두 숫자가 같다면 팰린드롬이다.

 

이 두가지 경우를 코드로 나타내면 아래와 같다.

for (int i = 1; i <= N; i++) {
		dp[i][i] = 1;
		dp[i][i + 1] = ary[i] == ary[i + 1] ? 1 : 0;
}

 

시작 인덱스와 끝 인덱스의 차이가 1인 범위의 dp값은 위와 같은 코드로 구했다.

(시작과 끝의 차이가 1인 범위 -> ex) dp[1][2] )

 

그럼 시작 인덱스와 끝 인덱스의 차이가 2인 곳 부터 구하면 되겠다.

 

<시작과 끝의 차이가 2이상일 때 팰린드롬인 경우>

1. 시작 인덱스의 값과 끝 인덱스의 값이 같다.

2. dp[시작 인덱스 +1][끝 인덱스 -1] 이 팰린드롬이다.

 

이 것을 코드로 나타내보면.

	for (int i = 2; i < N; i++) {
		for (int j = 1; j <= N; j++) {
			int k = i + j;
			if (k > N) break;
			if (ary[j] == ary[k] && dp[j + 1][k - 1] == 1) {
				dp[j][k] = 1;
			}
		}
	}

이런식으로 나타낼 수 있다.

전체 코드

#include<iostream>

using namespace std;
int N, M;
int ary[2002];
int dp[2002][2002];
int main() {

	scanf("%d",&N);
	for (int i = 1; i <= N; i++) {
		scanf("%d",&ary[i]);
	}
	for (int i = 1; i <= N; i++) {
		dp[i][i] = 1;
        if(ary[i]==ary[i+1]){
            dp[i][i+1]=1;
        }
	}
	for (int i = 2; i < N; i++) {
		for (int j = 1; j <= N; j++) {
			int k = i + j;
			if (k > N) break;
			if (ary[j] == ary[k] && dp[j + 1][k - 1] == 1) {
				dp[j][k] = 1;
			}
		}
	}
	scanf("%d",&M);
	for (int i = 0; i < M; i++) {
		int r, c;
		scanf("%d %d",&r,&c);
		printf("%d\n",dp[r][c]);
	}
}

후기

이 문제를 풀면서 상당히 짜증?이 났다...

 

분명히 아무리 생각해도 맞게 푼 것 같은데 자꾸만 시간초과가 나는 것이다....

 

이렇게 바꿔보고 저렇게 바꿔 보다가 1시간이 지나고... 결국 다른 분들의 코드를 참고하려 검색했다.

 

근데.. 이게 무엇?? 내가 푼 방식이랑 완전히 똑같은 코드가 올라와 있었다..

 

왜 안될까? 생각하다가 그분의 입출력 함수는 scanf()와 printf() 였다.  나는 cin cout을 사용하고 있었다.

 

어디선가 scanf printf가 속도측면에서 훨씬 빠르다는 글을 봤던 기억이 났다...

 

그래서 입출력 함수를 바꾸고 제출하니 통과가 됐다.

 

너무 억울한 문제였다..

반응형
반응형

어느덧 담배를 핀지 8년이란 시간이 됐다....

 

요즘들어 담배를 피고 나면 손에서 나는 냄새와 입 안이 텁텁한게 너무 싫었고,

 

집에 들어갈 때 부모님께 냄새가 날까봐 신경이 많이 쓰이고 담배값도 만만치 않게 빠져나가 금연을 결심하게 됐다.

 

저번에 금연을 도전하고 실패를 했었기에 이번에는 일반 연초, 궐련형 전자담배 보다 몸에 많게는 1/1000 가량 덜 해로운 액상 전자 담배를 피며 니코틴 욕구를 해소 하며 끊기로 결심했다.

 

액상 담배에는 니코틴 성분만 있기 때문에 몸에 많이 해롭지 않고, 니코틴은 소변으로 배출되기 때문에 건강에 안좋은 부분이 있긴 하겠지만 그래도 많이 해롭지 않다는 글을 보았다.(카더라에 약하다...)

 

그래서 당장 갖고 있던 담배를 다 버리고... 대략 20개 정도 되는 라이터도 다 버리고... 바로 전자담배 샵으로 직행!!

 

너무 종류가 많아서 뭐가 좋을지 고민하고 있었다. 

 

먼저 내가 제일 중요하게 생각한 것은

 

1. 안전성

 - 인터넷에 검색을 해 보면 전자담배가 폭발하는 사고를 몇몇 볼 수 있다. 이 원인으로는 쌘 전압?을 사용하는 전자담배에서 주로 발생하고, 베터리 형식이 아닌 건전지?를 사용하는 전자담배가 주로 원인이 된다고 한다.

 

2. 귀찮음 x

 - 5년전 전자담배가 처음 붐?을 일으켰을 때, 사서 1달정도 피고 관리하는게 너무 귀찮아서 다시 연초를 피게 되었다...

   코일도 주기적으로 갈고,, 청소도 했어야 됐던걸로 기억한다..

 

3. 휴대성

- 거대하고 무거운 것 보다는 작고 휴대하기 편한 것을 선호한다.

 

이러한 것을 잘 설명 드린 후 이쁘신 사장님께 추천을 받았다!

 

그것은 바로 " 몬스터 엑스팟 v2 "!!!

 

전압 조절 기능과 사용하지 않을 때는 기기를 꺼 놓을 수 있어 사고를 방지 할 수 있다는 점이 끌렸다. 

 

디자인도 너무 마음에 들고!!

 

 

액상은 청포도 맛이 괜찮게 느껴져서 청포도 맛으로 구매!

 

지금은 연초를 안핀지 3일 밖에 안됐지만, 담배냄새가 나지 않는 점이 제일 좋았고 아침에 일어날 때 상쾌하다!!!

 

연초를 피는 친구 옆에 있으면 피고 싶은 마음이 들지만 꾹꾹 참고 내 전담이와 함께 하고 있다..

 

전자담배도 끊게되는 그날까지 !! 금연!!

 

모두 금연하세요~!!

반응형

'일상~' 카테고리의 다른 글

SI기업 입사한지 50일...  (0) 2020.01.28
17년만에 이사를 가다!  (0) 2019.08.19
[영화 사자] 혼영 ~ /사자 후기  (0) 2019.08.06
후우.. 정신을 강하게~!~!~!~!  (0) 2019.07.11
나태함을 없애부려  (0) 2019.06.17
반응형

문제

상근이는 오락실에서 바구니를 옮기는 오래된 게임을 한다. 스크린은 N칸으로 나누어져 있다. 스크린의 아래쪽에는 M칸을 차지하는 바구니가 있다. (M<N) 플레이어는 게임을 하는 중에 바구니를 왼쪽이나 오른쪽으로 이동할 수 있다. 하지만, 바구니는 스크린의 경계를 넘어가면 안 된다. 가장 처음에 바구니는 왼쪽 M칸을 차지하고 있다.

스크린의 위에서 사과 여러 개가 떨어진다. 각 사과는 N칸중 한 칸의 상단에서 떨어지기 시작하며, 스크린의 바닥에 닿을때까지 직선으로 떨어진다. 한 사과가 바닥에 닿는 즉시, 다른 사과가 떨어지기 시작한다.

바구니가 사과가 떨어지는 칸을 차지하고 있다면, 바구니는 그 사과가 바닥에 닿을 때, 사과를 담을 수 있다. 상근이는 사과를 모두 담으려고 한다. 이때, 바구니의 이동 거리의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M < N ≤ 10) 둘째 줄에 떨어지는 사과의 개수 J가 주어진다. (1 ≤ J ≤ 20) 다음 J개 줄에는 사과가 떨어지는 위치가 순서대로 주어진다.

출력

모든 사과를 담기 위해서 바구니가 이동해야 하는 거리의 최솟값을 출력한다.

 

출처

<https://www.acmicpc.net/problem/2828>

 

그리디하게 생각해서 풀면 풀리는 문제이다.

 

알고리즘 순서입니다.

  1. 바구니가 있는 위치의 왼쪽 끝 위치를 저장 해놓는다.(시작위치 = 1)
    1. 오른쪽 끝 위치 -> 왼쪽 끝 위치 + 바구니 크기 - 1
  2. 사과의 위치를 입력받을 때 마다 다음을 처리한다.
    1. 바구니의 왼쪽 위치와 오른쪽 위치 사이에 사과가 떨어질 경우
      • 이동을 하지 않아도 되므로 아무 동작도 하지 않는다.
    2. 바구니의 왼쪽 끝 위치보다 이전 위치에 떨어질 경우
      • (왼쪽 끝 위치 - 사과 위치) 한 값을 결과에 더해준다.
    3. 바구니의 오른쪽 위치보다 오른쪽에 떨어질 경우
      • (사과위치 - 오른쪽 끝 위치) 한 값을 결과에 더해준다.

 

실행 코드

#include<iostream>
using namespace std;
int N, M, j;
int le = 1,res;
int main() {

	cin >> N >> M;
	cin >> j;
	for (int i = 0; i < j; i++) {
		int val;
		cin >> val;

		if(val<le){
			res += le - val;
			le = val;
		}
		else if(val>(le + M -1)){
			res += val - (le + M - 1);
			le = val - M + 1;
		}
	}
	cout << res << endl;

}

반응형
반응형

오늘 아침 수원 영통 메가박스에서 조조할인으로 혼영을 했다!

 

내가 본 영화 는 사자!

영화 사자

간단하게 후기를 적어보자면

 

킬링 타임용으로 보기에는 나쁘진 않은 것 같다.

 

다만 영화를 보는 내내 고막이 너무 아팠다.. ㅋㅋㅋㅋㅋㅋ

 

귀신에 들린 사람들이 소리를 빼애애애액! 지르는데 고막이... 큼...

 

눈물이 많은 편이라 안성기님의 연기를 보며 눈물을 흘렸다...

 

흘릴 부분인지는 모르겠지만 눈물이 나왔다 흑 ㅜ ㅜ

 

그리고 안성기님이 맡은 역할은 엄청난 노력파 엑소시스트 인데 박서준님이 맡은 역할은

 

너무 주인공 버프가 심했다..

 

아무 노력도 없이 어쩌다 얻은 능력으로 손을 마귀에게 탁 닿게 하면 화르르륵 타버리구..

 

그래도 둘의 케미 때문에 볼만 했다 ㅎㅎㅎㅎㅎ

 

후속작으로 '사제'도 나온다고 하니 나오면 봐야겠다 !!

 

간만에 혼영이라 좋았다

 

 

반응형

'일상~' 카테고리의 다른 글

SI기업 입사한지 50일...  (0) 2020.01.28
17년만에 이사를 가다!  (0) 2019.08.19
[금연 하자 금연!] 몬스터 엑스팟 v2  (0) 2019.08.10
후우.. 정신을 강하게~!~!~!~!  (0) 2019.07.11
나태함을 없애부려  (0) 2019.06.17

+ Recent posts