728x90

우분투를 실행 할 때 갑자기 vi가 작동이 안되는 경우가 있다.

vi로 파일 생성후 들어갔을 때

backspace로 내용이 작성되지 않고 방향키 누르니 A,B,C,D가 나왔다.

바로 vi오류가 발생한 것이었다. 

그래서 설정시 부족한 부분이 있었나 싶어

sudo apt-get install gcc make perl

을 이용해 입력을 해봤지만

이러한 오류가 떴다. 첫번째 에러를 치게 되면 방법이 나온다.

 

해결할 수 있는 방법은 첫번째로는 아래 코드를 치는 것이다.

sudo killall apt-get

이것을 입력했으나 결과는

no process found라는 결과가 나왔다. 

 

다음으로 할 수 있는 방법은 특정 위치에 있는 파일을 지우는 것이다.

sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock*

이 내용을 입력한 뒤

sudo dpkg --configure -a
sudo apt update

를 입력했다. 

 

이후 처음에 쳐 보았던

sudo apt-get install gcc make perl

를 입력했으나 최신 버전이라는 것 밖에 나오지 않았고 처음 오류가 이어져 또 다른 방법을 탐색했다.

 

https://yang1650.tistory.com/111

 

Ubuntu 설치후 vi 입력 오류 수정하기(방향키 abcd)

Ubuntu 설치후 vi 입력 오류 수정하기 증상 : 방향키 누르면 A, B, C, D 가 나오거나, 백스페이스 누르면 글자 안지워지는 현상 해결방법 : 사용자 디렉토리로 이동 # cd ~ .exrc 파일 생성 # vi .exrc set auto

yang1650.tistory.com

이 블로그를 참고했다.

cd ~
vi .exrc

로 파일에 접근해서

set autoindent
set bs=2
set nocp
set number(선택사항)

를 저장하고 나와 터미널에서 source .exrc를 입력한 뒤에 vi를 실행했더니

위 사진과 같이 a,i,o를 누르니 삽입이라는 결과가 나오게 되었다.

 

vi가 갑자기 되지 않으면 이렇게 해보길 추천한다.

728x90
728x90
문제

ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.

문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

그림 1. H = 6 이고 W = 12 인 H × W 호텔을 간략하게 나타낸 그림

방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.

입력

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). 

출력

프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.

 

예제입력

2

6 12 10

30 50 72

예제출력

402

1203

#include <stdio.h>
int main(void){
    int T,H,W,N;
    int room;
    scanf("%d", &T);//테스트데이터개수
    for(int i=0;i<T;i++){
        room=0;
        scanf("%d %d %d", &H, &W, &N);
        if(N%H==0){
            room+=(H*100+(N/H));
        }
        else{
            room+=((N%H)*100+(N/H+1));
        }
        printf("%d\n", room);
    }
    return 0;
}

실패로 포기했다가 풀었던 문제이다. 실패한 이유는 바로 꼭대기 층 배정이었다. 이번에도 처음엔 개선했다고 생각했지만 아니였다. 다른 사람이 한 것을 보고 설명은 본 뒤 이해할 수 있었다. 내가 한 방식에서의 오류는 N에서 H를 나눈 나머지의 값이었다. 만약 나머지가 0일 경우에는 층수가 나오지 않게 된다. 그외의 경우에는 모두 나온다. 층수를 식을 크게 건드리지 않고 풀어볼까하다가 N%H가 0일때만 층수로 호수를 만들어주면 되겠다는 생각이 들었다. 

아닌 경우에는 호수가 N/H를 하면서 몫이 0이 나올 수 있다. 이를 해결하는 방법은 몫에 1을 더해주면 된다. 이렇게 해결해주면 ACM호텔에서 호수를 정확히 보여주게 된다.

728x90
728x90
문제

창영이는 노래 여러 개를 이어서 부르는 가수이다. 유명한 노래의 비슷한 멜로디를 이어서 부르면서 언제 곡이 넘어갔는지 모르게 만드는 것이 창영이 노래의 특징이다. 이런 노래로 상업적으로 엄청난 성공을 거둔 창영이에게 큰 시련이 찾아왔다. 그것은 바로 저작권이었다.

창영이의 노래에 포함되어 있는 멜로디는 모두 저작권이 다른 사람에게 있는 노래이다. 따라서, 이 음악으로 상업적인 활동을 했기 때문에, 저작권 협회에 저작권료를 내야한다.

창영이는 자신의 앨범에 포함되어있는 저작권이 있는 멜로디의 평균값을 구해보기로 했다. 이 값은 아래와 같이 구할 수 있다.

(창영이 앨범에 수록된 곡에 포함되어 있는 저작권이 있는 멜로디의 개수) / (앨범에 수록된 곡의 개수)

이때, 평균값은 항상 올림을 해서 정수로 만들어야 한다. 예를 들어, 창영이의 1집 앨범 "영창에서 영원히 영창피아노를 친다"에 총 38개 곡이 수록되어 있고, 이 앨범에 저작권이 있는 멜로디가 894개가 있다면, 평균값은 23.53이 되고 올림해서 24가 된다.

매니저 강산이는 얼마나 많은 사람에게 저작권료를 주어야 하는지 궁금해졌다. 강산이가 알고 있는 정보는 앨범에 수록되어 있는 곡의 개수와 위에서 구한 평균값이다. 이때, 적어도 몇 곡이 저작권이 있는 멜로디인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 앨범에 수록된 곡의 개수 A와 평균값 I가 주어진다. (1 ≤ A, I ≤ 100)

출력

첫째 줄에 적어도 몇 곡이 저작권이 있는 멜로디인지 출력한다.

입력예시
38 24
1 100
10 10
출력예시
875
100
91
나의 풀이
#include <stdio.h>

int main(void){
    int s, avg,result;
    scanf("%d %d", &s, &avg);
    result=(avg-1)*s+1;
    printf("%d", result);
    return 0;
}

문제를 읽기보다는 입력, 출력에 맞추어 푼 문제.

긴 문제에서는 크게 얻을 내용이 없었다.

일단 어떤 원리로 이루어졌는지 분석했다.

전체 멜로디/곡 갯수=평균이었고

멜로디를 구하기 위해선 멜로디=평균*곡 갯수 였다.

여기서 주의해야 하는 것이 있는데 바로 평균*곡 갯수가 멜로디가 무조건 성립하지는 않는다.

소숫점 아래에서 반올림된 것이 있기에 최솟값을 구해야 하므로 평균값에서 하나를 빼주어야 하고 결과를 계산할 때에는 .0보다는 크므로 +1를 해주어야 한다. 그래야 결과예시와 맞는 결과가 나오게 된다.

이 문제는 문제 식이 어떻게 이루어졌는지 분석하는 것이 필요한 문제라고 생각이 든다.

728x90

+ Recent posts