문제 링크 : https://www.acmicpc.net/problem/2839


해결 방법)


Nkg 무게를 5kg과 3kg봉지로 최소로 가져가야 됬기에 5kg을 기준으로 최대 많이가져갈 수 있는 N/5 부터 0(5kg없는거) 까지의

모든 경우의 수를 제시하고 그에따라 3kg 봉지로 나눴을때 나머지가 0이면 답을 구할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
int main()
{
    int five;
    int three;
    int i;
    int tmp;
    int base;
    scanf("%d",&base);
    
    for(i = (base/5); i>=0; i--)
    {
        tmp = base;
        tmp = tmp -(i*5);
        if(tmp % 3 == 0)
        {
            three = tmp / 3;
            printf("%d\n",i+three);
            break;
        }
    }
    if(i <0)
    {
        printf("-1");
    }
}
cs


반응형

'PS > 백준' 카테고리의 다른 글

2448번 별 찍기 - 11  (0) 2018.11.12
1966번 프린터 큐  (0) 2018.10.28
7576번 토마토  (0) 2018.10.24
14891번 톱니바퀴  (0) 2018.10.15
15686번 치킨 배달  (0) 2018.10.14

임베디드 개발에 미련이남아 보라스카이라는 드론관련회사 쪽에 임베디드 sw엔지니어 공고를 보고 지원했었다.


오늘 면접을 보러 갔었고 끝나고 나서의 후기를 적겠다. 난 앞으로 면접을 볼때마다 어떤회사든 후기를 남기며 취업정보를 하나씩 쌓겟다.


이곳 면접방식은 1:1로 면접을보고 추후에 2차면접을 보는식이다. 면접을 그래도 간간히 했었기 때문에 간략한 회사정보와 제품만보고 따로 시간을 들여 준비를 안하고 면접을 보러갔었다.


먼저 처음에 자기소개를 했었고, 무난한 질문을 받으며 좋은 분위기로 시작했었다.

그런데 질문이 점점 생각과는 다른 것들이 들어왔었다. 보통 sw엔지니어는 개발관련 질문과 포트폴리오에서도 맡은 sw개발역할과 역량을 물어보는 질문을 받아야하는데...


받은질문(기억나는거 몇개) 

1. 회로도 본적있나? 

2. cad 써봣나?

3. (포트폴리오를 보시고나서) 이 회로 어떻게 구성하고 모로 그렸나?

4. (자소서보고) metor 프로그램이 뭔가? (하드웨어관련)

이것외에도 여러 질문들을 받았는데 나는 듣다보니 sw개발 엔지니어를 뽑는건인지 의문이 들었었다...

물론 임베디드 sw개발이라면 hw의 이해도 중요하지만 그래도 그렇지 SW개발자인데 ,,, 개발관련의 질문은 거의 없었고 대부분 hw관련 질문뿐이라 솔직히 조금 실망했다...

내가 지금 까지 알고리즘 공부를 하고있고 문제해결력이 있다는 것을 어필하기도 했었지만, 그건 대수롭지않게 생각하고 넘어가는듯했다.. 

모라고 해야되지... 중소기업은 대체로 PS를 인정해주지 않는듯한 분위기다.

프로그램 만든거 즉 결과물을 만들어 낸 것을 더 중요하게 생각하는 것같다.  난 아직 프로그램은 아직 만들어 보지도 못했는데..콘솔에서만 프로그래밍했단말이야 아직..


무튼 오늘 면접을 보고나서 좀더 신중해져야겠다라는 생각을 하게됬다. 이 회사가 과연 내가 시간과 돈을 투자해서 면접을 볼만한 가치가 있는곳인가? 를 꼼꼼히 따져보고 물어볼 것이다.




반응형

'일기' 카테고리의 다른 글

새벽에 글쓰고자야디  (0) 2018.10.22
단기알바 한날 - 창업박람회 스탭  (0) 2018.10.21
모니터랩 필기 시험 후기  (0) 2018.10.17
5년 뒤에 어떤모습이 될까?  (0) 2018.10.16
웹퍼블리셔 스터디한날  (0) 2018.10.16

어그저께 서류 합격 소식을 듣고 오늘 필기 시험을 보러  갔다. 


지원 분야가 C와 관련된 일을 하기때문에 C언어로 문제를 풀어야했다.


문제는 총 3문제였는데 처음 문제지를 보자마자 이걸 어떻게 구현하지라는 생각이 먼저 들었다.


그래도 한번 해보자는 생각으로 풀어보기로 했다. 


그런데 개발하는 환경이 정말 마음에 들지않았다. 글씨 크기가 너무작아서 오류가 난 것을 확인하기 어려울 정도였다. 내가 조정하면은 됬지만 설정메뉴도 안보이게 해놔서 정말이지 답답했다.


그래도 꾹꾹 참고 문제를 풀어나갔다.


1번 문제는 리눅스 api를 써서 해당 폴더안에 있는 파일정보를 읽어들여 처리하는 문제였다.

처음 보는 함수여서 어떻게 써야하는지 애매했지만 인터넷을 사용할 수 있도록 해줘서 쓰는 방법을 이해한후 문제를 풀 수 있었다.

그런데 코딩을 하다가 또 무슨에러인지 virtualbox가 멈췄고 이것때문에 시간을 30분정도 허비하게됬다.ㅜㅜ 자기퇴근하기전까지 문제를 풀라고는 했지만... 그래도 나는 뒤에 약속도 있었고 해서 빨리 끝내고 싶었다.


부랴부랴 2번문제를 봤고, 이건 단순히 문자열을 파싱하는 문제였어서 문자열범위를 전부탐색하면서 원하는 부분만 출력하도록 해줬다.

말은 간단히했지만 한 한시간 걸렸던거같다;;;


3번문제는 링크드리스트를 활용해서 프로그램을 설계하는것이었는데, 나는 이문제는 못풀었다. 

핑계일 수 있지만 나는 c++ 라이브러리를 써서 링크드리스트를 썼었기 때문에 이 링크드리스트를 구현하는것에 익숙하지않았다.

물론 구글링을 통해서 링크드리스트를 이해하고 풀어나가면 됬지만 이 링크드리스트 구현에 필요한 로직을 먼저 이해하는 시간도 오래걸리고, 이것을 활용해서 원하는 프로그램을 설계까지 하기에는 담당자가 퇴근하기 전까지 끝낼 수가 없다고 생각했다. 


결국 3번은 못풀게 됬고, 담당자에게 끝낫다고 알렸다. 

결과는 아마 불합격이라고 생각되지만 내가 못푼 링크드리스트를 나중에라도 개념을 이해해보고 직접 구현을 해봐야겠다.

내가 만약 어떤 자료구조를 쓰려고 한다면 라이브러리를 먼저 쓰기보다는 그 개념을 먼저 이해하고 구현할 줄 알아야 깊은 이해를 할수 있는 것이기 때문이다.


무튼 오늘은 내 수준을 확인 할 수 있었던 좋은 시간인것 같다.

반응형

'일기' 카테고리의 다른 글

단기알바 한날 - 창업박람회 스탭  (0) 2018.10.21
보라스카이 면접 후기  (0) 2018.10.18
5년 뒤에 어떤모습이 될까?  (0) 2018.10.16
웹퍼블리셔 스터디한날  (0) 2018.10.16
알고리즘 잡스 상담후기  (8) 2018.09.30

오늘 어떤 사람과 얘기하면서 내 미래를 생각해 보는 시간을 가지게 되었다.


그 사람은 하고싶은 분야를 구체적으로 빨리 정해서 하나를 계속 파라는 조언을 해줬다. 현실적이고 직설적이게..

대기업에는 못간다며 단호하게 말을 해줬고 나는 그렇게 나를 평가한것에 조금 기분이 나빳다.


근데 생각해보면 일리가 있기도 한거같다. 인적성이나, 코딩테스트 어느것하나 안정적이다라는 느낌은 없기 때문이다. 

또 이제 나이가 점점 많아지는데 하루빨리 방향을 잡으라는것은 당연한 말이기도 하다.

일을 시작해서 돈을 벌고 이제 독립을 서서히 준비해야 되기 때문이다.  친한 친구가 결혼을 벌써한거보면 내가 좀 늦긴하구나라고 확실히 느껴진다....


그렇다면 어떻게해야될까..

일단은 나는 지금 일을 해야한다. 이건 무조건적이다.  왜냐하면 나는 지금 매순간 매순간 생각이 바껴지고 많아지고 어느 것 하나 제대로 하지못한 채로 시간만 지나가기 때문이다.

내가하고싶은일?? 내가 좋아하는일?? 은 직접해봐야 아는것인데 취직을 안한상태에서는 다른것을 제대로 집중해서 하기가 힘들고 항상 일을 해야되는데라는 생각이 바탕으로 깔리기 때문에 심리적으로도 건강하지 못하게 되는것 같다..

내 성격이 조금 예민하고 생각이 많아서 더욱 힘들다고 생각한다.

다시한번 말하지만 좋아하는 거 하고싶은거를 정하기전에 일 먼저 일단 해야한다.


그래서 지금 내가 가지고 있는 능력, 할수있는거를 단순하게 생각해보고 이것이 만족되는 일을 찾아서 일단 해야겠다.

그렇게되면 심리적인 불안이 없어지고 다른것을 하기위한 준비상태가 될 수 있다.

물론 일을 하면 마음에 안드는 일 때문에 심리가 더 꼬여버릴 수도 있게된다. 하지만 적어도 나는 경제활동을 하고있고 다른 일을 하기위한 준비를 마련해 나갈수있는건 맞기 때문에 괜찮다. 여기서 챙길수 있는건 아마도 사회생활능력+돈+사람들 일것이다. 

이러는 동안 어느정도 경력이쌓이고 여유가 생길때쯤 (한 3년후겟지??) 그떄 그 상황에서 하고싶은거 바로 떠오르는거를 묻지도 따지지도 않고 도전해볼 것이다.(물론 이떄도 일을하면서!)

그리고 몬가 재밌고 다른 많은사람들에게도 인정을 받을 수 있을 정도가 되고나면 나는 이 일을 주업으로 바꿀것이다.

이렇게 주업으로 일을 하다가 또다시 여유가 생길때쯤이면 하나씩 하나씩 도전을 계속해나갈것이다.

이렇게되면 나는 5년 뒤에 나의 과거를 되돌이켜 보면서 후회를 하지 않을 수 있기 때문이다. 난 현재 과거를 되돌이켜보면 후회가 되는 시간들이 많다. 왜냐하면 생각만하고 실천은 하지않으며 살아왔기 때문이다. 즉 이뤄낸것이 별로없다는 것이다.

지금이라도 깨달았으니 5년뒤에 나를 위해서 실천하는 나로 조금씩 조금씩 바껴서 알찬 시간들을 보냈다라고 기억에 남기고 싶다.












반응형

'일기' 카테고리의 다른 글

보라스카이 면접 후기  (0) 2018.10.18
모니터랩 필기 시험 후기  (0) 2018.10.17
웹퍼블리셔 스터디한날  (0) 2018.10.16
알고리즘 잡스 상담후기  (8) 2018.09.30
추석날 부천역 드롭탑에서 공부  (0) 2018.09.25

오늘 두 번째 웹퍼블리셔 스터디를 했다.


저녁 8시부터 11시까지 해서 집에 돌아오니 12시가 되버렸다. 지금 글쓰는 시간은 새벽 2시가 됬다.


새벽 2시가 된 이유는 스터디에서 배운 내용을 복습하려다 보니 늦어져버렸다.


지금 스터디에서 기억에 남는건 두가지이다. 


하나는 조장이 사온 떡복이랑 김밥이 너무 맛있었다는 것

또 하나는 웹페이지 만드는건 어려운게 아니였다라는것, 이것은 GNB를 만들면서 페이지를 만들어가기 위한 일련의 작업을 직접 경험하고나니 쉬웠기 때문이다.

이전에는 아 이거 어디부터 어떻게 시작해야하는지 감이 없었다면 방향을 잘 제시 해준 것 같아서 좀 후련한 느낌이 들었다. 


다음에 일기 쓸 땐 좀더 나은 내가 되길 바라면서 이만 바이~

반응형

'일기' 카테고리의 다른 글

모니터랩 필기 시험 후기  (0) 2018.10.17
5년 뒤에 어떤모습이 될까?  (0) 2018.10.16
알고리즘 잡스 상담후기  (8) 2018.09.30
추석날 부천역 드롭탑에서 공부  (0) 2018.09.25
내가 좋아하는것 찾는 방법  (0) 2018.09.04

문제링크) https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5P1kNKAl8DFAUq


문제는 각줄마다 문장이 입력이 되는데 그 문장에서 반복마디를 구하면된다.

-입력-

KOREAKOREAKOREAKOREAKOREAKOREA

SAMSUNGSAMSUNGSAMSUNGSAMSUNGSA

GALAXYGALAXYGALAXYGALAXYGALAXY

EXOEXOEXOEXOEXOEXOEXOEXOEXOEXO

B1A4B1A4B1A4B1A4B1A4B1A4B1A4B1

APINKAPINKAPINKAPINKAPINKAPINK

BLACKPINKBLACKPINKBLACKPINKBLA

TWICETWICETWICETWICETWICETWICE

REDVELVETREDVELVETREDVELVETRED

ABCABCABCABCABCABCABCABCABCABC

-출력-

#1 5

#2 7

#3 6

#4 3

#5 4

#6 5

#7 9

#8 5

#9 9

#10 3

이문제 핵심은 반복마디가 최소로 반복되는 길이여야 한다. 맨마지막 입력예시를 보면 abcabcabcabc라서 abc가 반복이될수도있고

abcabc가 될수도있고 abcabcabc가 반복될수도 있기에 모두 정답이 될 수 있다. 하지만 출력을 보면 이 반복되는 것들 중에서도 최소의 길이를 갖는

반복패턴을 원한 것을 알 수 있었다.


반복마디의 길이가 최대 10길이여서 

1~10까지의 반복마디를 각각 생성하고나자마자 만들어진 반복마디와 기존배열을 반복마디의 개수만큼 계속해서 비교해나가주었다.

그렇게되면 하나라도어긋나면 정답이 아니게되므로 자연스럽게 반대의 경우만이 정답이 된다.


소스코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
using namespace std;
int main()
{
    int test_case;
    cin >> test_case;
    for(int t= 1; t<=test_case; t++)
    {
    
        char str[31];
        char repeat[11]; //반복 문자열 
        int cnt;
        int j;
        int ret;
        int k;
        cin >> str;
        int len; // 반복 길이 
        for(len = 1; len <= 10; len++)
        {
            cnt = 0;
            k = 0;
            for(int i = 0; i<len; i++)
            {
                repeat[i] = str[i];
            }
            
            for( j = len; j<30; j++)
            {
                if(cnt == len)
                {
                    cnt = 0;
                    k = 0;
                }
                if(repeat[k++]!= str[j])
                {
                    break;
                }
                cnt++;
            }
            if(j == 30)
            {
                ret = len;
                break;
            }
        }    
        cout <<"#"<<<<' '<< ret << '\n';
    }    
}
    
cs



반응형

'PS > SWEA' 카테고리의 다른 글

D1 1545번 거꾸로 출력해 보아요  (0) 2022.05.06
5986번 새샘이와 세 소수  (0) 2018.11.03
1859번 백만 장자 프로젝트  (0) 2018.10.13
5550번 나는 개구리로소이다  (0) 2018.10.06
1926번 간단한 369게임  (0) 2018.10.05

문제 링크 : https://www.acmicpc.net/problem/14891


해결방법)

문제를 읽고나서 생각해 봣는데 각 명령마다 순차적으로 톱뉘를 돌려나가면 되겠다라고 생각했다.

즉, 단순구현으로 풀었고(소스가 더러운느낌,..) 톱니번호와 회전방향을 가지고 있는 그대로 코드를 짜보았다.


- 알고리즘 순서 

1. 톱니 바퀴 정보를 입력받는다.

2. 각 명령을 하기 직전에 톱니들 사이의 접합부분이 맞닿았는지 혹은 떨어졌는지를 확인한다

3. 명령마다 주어진 바퀴번호와 회전방향을 보면서 해당 바퀴번호 기준으로 접합정보를 차례대로 비교해 나가면서 바퀴를 회전 시켜준다.

4. 명령이 끝날때까지 2,3번을 반복하고 반복이 끝나면 답을 구해줄 수 있다.



소스코드) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#include<iostream>
#include<cstring>
#define LEFT 6
#define RIGHT 2
using namespace std;
int cnt_cmd;
int wheel[4][8]; // 바퀴 0, 1, 2, 3
// 0 1 2 3 4 로 0은 12시방향 
int flag[4]; // 4바퀴의 회전여부 
void Check(int wheel[][8])
{
    if (wheel[0][RIGHT] == wheel[1][LEFT])
    {
        flag[0= -1;
    }
    else
    {
        flag[0= 1;
    }
    if (wheel[1][RIGHT] == wheel[2][LEFT])
    {
        flag[1= -1;
    }
    else
    {
        flag[1= 1;
    }
    if (wheel[2][RIGHT] == wheel[3][LEFT])
    {
        flag[2= -1;
    }
    else
        flag[2= 1;
 
}
void moveLeft(int wheel[][8] , int wheelnum)
{
    int tmp = wheel[wheelnum][RIGHT];
    for (int i = 3; i <= 7; i++)
    {
        wheel[wheelnum][i - 1= wheel[wheelnum][i];
    }
    wheel[wheelnum][7= wheel[wheelnum][0];
    wheel[wheelnum][0= wheel[wheelnum][1];
    wheel[wheelnum][1= tmp;
}
void moveRight(int wheel[][8] , int wheelnum)
{
    int tmp = wheel[wheelnum][LEFT];
    for (int i = 5; i >= 0; i--)
    {
        wheel[wheelnum][i + 1= wheel[wheelnum][i];
    }
    wheel[wheelnum][0= wheel[wheelnum][7];
    wheel[wheelnum][7= tmp;
}
int main()
{
    for (int j = 0; j < 8; j++)
    {
        scanf("%1d"&wheel[0][j]);
    }
    for (int j = 0; j < 8; j++)
    {
        scanf("%1d"&wheel[1][j]);
    }
    for (int j = 0; j < 8; j++)
    {
        scanf("%1d"&wheel[2][j]);
    }
    for (int j = 0; j < 8; j++)
    {
        scanf("%1d"&wheel[3][j]);
    }
    /*for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            printf("%d ", wheel[i][j]);
        }
        puts("");
    }*/
    cin >> cnt_cmd;
    int select, dir;
    int ret = 0;
    int tmp;
    for (int i = 0; i < cnt_cmd; i++)
    {
        scanf("%d %d"&select, &dir);
        memset(flag, 0sizeof(flag));
        // 한번의 명령 마다 12시 방향값들을 더해나간다.
 
        Check(wheel);
        if (select == 1)
        {
            // 1번 바퀴일때 
            if (dir == -1)
            {
                moveLeft(wheel, 0);
                if (flag[0== 1// 다르다면 회전한다.
                {
                    //반시계일때
                    moveRight(wheel, 1);
                    if (flag[1== 1)
                    {
                        moveLeft(wheel, 2);
                        if (flag[2== 1)
                        {
                            moveRight(wheel, 3);
                        }
                    }
                }
            }
            else if (dir == 1)
            {
                //시계일때
                moveRight(wheel, 0);
                if (flag[0== 1// 다르다면 회전한다.
                {
                    moveLeft(wheel, 1);
                    if (flag[1== 1)
                    {
                        moveRight(wheel, 2);
                        if (flag[2== 1)
                        {
                            moveLeft(wheel, 3);
                        }
                    }
                }
            }
        }
        else if (select == 2)
        {
            if (dir == -1)
            {
                moveLeft(wheel, 1); // 두번째바퀴 시계반대돌리고
                if (flag[0== 1)
                {
                    moveRight(wheel, 0); // 첫번째바퀴 시계방향돌린다.
                }
                if (flag[1== 1)
                {
                    moveRight(wheel, 2);
                    if (flag[2== 1)
                    {
                        moveLeft(wheel, 3);
                    }
                }
            }
            else if (dir == 1)
            {
                moveRight(wheel, 1);
                if (flag[0== 1)
                {
                    moveLeft(wheel, 0);
                }
                if (flag[1== 1)
                {
                    moveLeft(wheel, 2);
                    if (flag[2== 1)
                    {
                        moveRight(wheel, 3);
                    }
                }
            }
        }
 
 
        else if (select == 3)
        {
            if (dir == -1)
            {
                moveLeft(wheel, 2);
                if (flag[1== 1)
                {
                    //왼쪽이 달라서 돌릴수잇다면 
                    moveRight(wheel, 1);
                    if (flag[0== 1)
                    {
                        moveLeft(wheel, 0);
                    }
                }
                if (flag[2== 1)
                {
                    moveRight(wheel, 3);
                }
            }
            else if (dir == 1)
            {
                moveRight(wheel, 2);
                if (flag[1== 1)
                {
                    moveLeft(wheel, 1);
                    if (flag[0== 1)
                    {
                        moveRight(wheel, 0);
                    }
                }
                if (flag[2== 1)
                {
                    moveLeft(wheel, 3);
                }
            }
        }
        else if (select == 4)
        {
            if (dir == -1)
            {
                moveLeft(wheel, 3);
                if (flag[2== 1)
                {
                    moveRight(wheel, 2);
                    if (flag[1== 1)
                    {
                        moveLeft(wheel, 1);
                        if (flag[0== 1)
                        {
                            moveRight(wheel, 0);
                        }
                    }
                }
            }
            else if (dir == 1)
            {
                moveRight(wheel, 3);
                if (flag[2== 1)
                {
                    moveLeft(wheel, 2);
                    if (flag[1== 1)
                    {
                        moveRight(wheel, 1);
                        if (flag[0== 1)
                        {
                            moveLeft(wheel, 0);
                        }
                    }
                }
            }
        }
 
    }
    ret = 0;
    if (wheel[0][0== 1)ret += 1;
    if (wheel[1][0== 1)ret += 2;
    if (wheel[2][0== 1)ret += 4;
    if (wheel[3][0== 1)ret += 8;
 
    cout << ret << '\n';
}
cs


반응형

'PS > 백준' 카테고리의 다른 글

2448번 별 찍기 - 11  (0) 2018.11.12
1966번 프린터 큐  (0) 2018.10.28
7576번 토마토  (0) 2018.10.24
2839 설탕배달  (0) 2018.10.19
15686번 치킨 배달  (0) 2018.10.14

문제 링크 : https://www.acmicpc.net/problem/15686


해결 방법)


풀고나서 다른 해결방법들을 보니까 대게 비슷하게 푼것같다. 

그래도 내가 푼 아이디어를 풀어보고자 한다. (누군가에게는 도움이 되겟지하는 생각에)

치킨집 고르는 경우 즉 M개(1개의 치킨집, 2개의 치킨집, 3개의 치킨집 ...... M개의 치킨집) 에서 모든 집들과의 거리중 최소거리만 구하여 이 최소거리의 합들이 우리가 구하고자하는 도시의 치킨거리값이 되는 것이다.


그런데 우리는 1개를 어떻게고르고 2개를 어떻게고르고에 대한 아이디어가 없당 ㅜ 이것은 재귀적으로 상황을 두개 만들어 주면 된다. 있고, 없고의 두가지상황인데 A,B,C의 치킨집이있다고하면,

A 있고 B 있고, C 없고

A 없고 B 있고 C 없고 .... 요론식으로 하다보면 모든 경우의수를 찾을 수 있다는 느낌을 받을 수 있다.

즉 각 치킨집마다 있고 없고의 상황 두가지를 만들어서 치킨집을 먼저 고를 수 있다.


이제 골라진 치킨집이 1개일때,2개일때 ,3개일때, 4개일때..... M개 이하 일때 마다 치킨 거리 총합을 알아야지 도시의 치킨거리를 알 수 가있는데 어떻게 골라진 치킨집 개수마다 그 치킨거리 총합을 알아낼 것인가가 문제이다.


이 해결방법은 모든 집마다 거리를 구하는데 골라진 집들과의 사이를 구하면서 최소값을 각 집마다 구해나가는 것이다.

우리는 각치킨집마다 경우를 있고,없고의 두가지 경우를 만들었는데, 이때 치킨집이 있다라면 이 치킨집은 골라진녀석이고 따로 골라졌다라는 표식을 남겨두면 나중에 골라진 치킨집에대해 거리값을 구해나갈수 있다.

따라서 골라진 치킨집과 모든 집들사이의 거리를 구할 수 있게되고 당연히 최소값도 구하게되면서 이 최소값들의 총합이 결국엔 우리가 구하는 답이 된다.


또 참고로 최대 M개라고해서 M개를 골랐을때만 왜 조건을 거냐라고 말할 수 있는데, 어차피 FOR문을 돌면 각집이 치킨집들 중 최소값만 지니기 때문에 하나의 치킨집만 선택된경우도 자연스레 포함이 되어 모든 경우를 내포하기때문이다.


소스코드)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int ans = 987654321// 도시의 치킨거리
int M;
int visit[13];
vector<pair<intint>> home; // 집좌표
vector<pair<intint>> chicken; // 치킨 좌표
int csize;
int min(int a, int b) { return a < b ? a : b; }
void solve(int inow, int cnt_now)
{
    if (cnt_now == M) // 최대 M개를 고를때
    {
        int d; // 두점사이의 거리
        int x1, x2;
        int y1, y2;
        int tmp = 0;
        int homesize = home.size();
        for (int i = 0; i < homesize; i++)
        {
            int minnum = 987654321;
            for (int j = 0; j < csize; j++)
            {
                if (visit[j]) 
                {
                    d = abs(home[i].first - chicken[j].first) + abs(home[i].second - chicken[j].second);
                    if (minnum > d)
                        minnum = d;
                }
            }
            tmp += minnum;
            
        }
        ans = min(ans, tmp); //도시치킨거리 갱신
        return;
    }
    if (inow >= csize) return
    visit[inow] = 1;// 현재 치킨집 선택
    solve(inow + 1, cnt_now + 1); 
    visit[inow] = 0
    solve(inow + 1, cnt_now);
}
int main()
{
    int N;
    int num;
    cin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            scanf("%d"&num);
            if (num == 1)
            {
                home.push_back({ i,j });
            }
            else if (num == 2)
            {
                chicken.push_back({ i,j });
            }
        }
    }
    csize = chicken.size();
    solve(00);
    printf("%d\n",ans);
}
cs


반응형

'PS > 백준' 카테고리의 다른 글

2448번 별 찍기 - 11  (0) 2018.11.12
1966번 프린터 큐  (0) 2018.10.28
7576번 토마토  (0) 2018.10.24
2839 설탕배달  (0) 2018.10.19
14891번 톱니바퀴  (0) 2018.10.15

문제링크 : https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LrsUaDxcDFAXc&categoryId=AV5LrsUaDxcDFAXc&categoryType=CODE

(로그인 해야볼수있듬!)


해결 방법 :


쉬운난이도 문제라고해서 풀어보았는데, 하도 안풀려서 다른 사람의 힌트를 얻고 겨우 풀어낸 문제....


이 문제의 핵심은 최대이득을 구하기위해서는 사고팔고를 적절히 해야하는 방법을 생각해야하는데


그 방법이 맨뒤에서 부터 처음까지 도는 가운데 최대가격의 값을 기준으로 이득이 생기는 부분의 총합을 더하는 것이었다.


내가 헤맨것이 모든 가격을 내림차순으로 최대값순으로 새로운 배열을 만들고 만든 배열과 주어진 가격 배열을 하나씩 비교해 나가면서 더해나간게 문제였다.

예시의 테스트케이스는 다 통과되서 아 이게 맞다라고 생각하고(답정) 한게 큰 패인이다..

1 1 4 5 2 1 이 테스트케이스만 보더라도  5 4 2 1 1 1 이런 새로운 배열과 하나씩 비교할텐데, 4가 5안에 포함되어버려 이미 계산이 끝낫지만 여전히 새로운 배열에 비교 대상으로 존재해있어서  뒤에 2, 1 부분도 계산을 해준것이기 때문이다 ... 


엄청난 뻘짓을 하고나서 힌트를 본후 , 대부분 사람들은 뒤에서 부터 계산을 해서 답을 찾았다는 것을 보았고, 

아 그럼 뒤에서 부터 최대값을 갱신해주고 그 최대값보다 작으면 계속더해가는 방식이 모든 경우를 해결해 줄 수 있다는 것을 알게되었다.


위의 1 1 4 5 2 1 을 보면

맨뒤의 1을 max로 둔다.

그리고 맨뒤에서부터 처음일때까지 전부 비교해준다.

만약 현재 max 보다 크다면 max만 갱신해준다.

아니라면 max값보다 작으므로 이득을 더해나가준다.

이렇게 전부 계산해주고나면, 이득생기는 부분을 전부더해줘서 최대이득을 구할 수 있게된다.


소스코드) 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
long long max_margin = 0;
int cost[1000001];
using namespace std;
int main()
{
    int test_case;
    
    cin >> test_case;
    for (int t = 1; t <= test_case; t++)
    {
        max_margin = 0;
        int max_price;
        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            scanf("%d"&cost[i]);
        }
        max_price = cost[n - 1];
        for (int i = n - 2; i >= 0; i--)
        {
            if (max_price > cost[i])
            {
                max_margin += max_price - cost[i];
            }
            else
            {
                max_price = cost[i];
            }
        }
        printf("#%d %lld\n", t, max_margin);
    }
}
cs


반응형

'PS > SWEA' 카테고리의 다른 글

5986번 새샘이와 세 소수  (0) 2018.11.03
2007번 패턴 마디의 길이  (0) 2018.10.16
5550번 나는 개구리로소이다  (0) 2018.10.06
1926번 간단한 369게임  (0) 2018.10.05
1868번 파핑파핑 지뢰찾기  (0) 2018.09.30

문제링크  : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWWxqfhKAWgDFAW4&categoryId=AWWxqfhKAWgDFAW4&categoryType=CODE&&&

(로그인 해야볼수있듬!)


해결방법 )

하나의 개구리는 한번의 울음소리 뿐만아니라 여러번 운다는 것이 문제의 힌트같다.

내가 선택한 방법은 전체울음소리와 check할 "croak"을 순차적으로 검사를 하고 원래 녹음된 울음소리에서 기본울음소리 패턴을 제거해 주는 방식을 하면서 답을 구했다. 한번 루프를 돌때마다 cnt를 증가해서 개구리 수를 구했다. (일단 연속되게 운 개구리 한마리를 먼저 걸러내주기 위해서!)



ex)  


1)

기본울음소리위치 값과 녹음된 울음소리의 위치 값이 똑같다면 녹음된 울음소리에서 그 값을 빼준다.

그리고 pos 위치를 다음 검사 위치로 이동함!


2)


여기서 눈여겨 봐야할 곳은 녹음된 울음소리의 위치이다.

녹음된 울음소리는 Vector에 저장시키기 때문에 erase(a+i) 를 써서 i번째위치를 삭제시키고 그래서 자동으로 앞으로 당겨지게되어 size가 하나 줄어든다.

그리고 pos 현재위치값과 녹음된 울음소리 위치값이 다르기 때문에 반복인덱스를 하나 증가시킨다.


3)




기본울음소리위치 값과 녹음된 울음소리의 위치값이 똑같기 때문에 제거해주고 뒤에도 남은 위치값이 같으므로 전부 빼지게 된다.

이렇게 되면 녹음된 울음소리에는 “C”만 남게된다.

검사위치가 4까지가서 전부 탐색이 된것이고 5가되면 0으로 다시 만들어줘서 CROAK을 전부 제거했다라는 의미를 부여함 

  -> pos 위취가 0이면 재탐색 가능!


4)



CPos 처음 값과 같기 때문에 빼준다.

최종적으로 녹음된 울음소리는 없기 때문에 전부 검사를 하게 된 것! 이고, 밑에 기본울음소리에서 검사위치가 0이 아니기때문에 완전한 CROAK을 못만들었다는 의미라서 -1 출력한다. 만약 0이면 CROAK을 전부 제거했다라는 의미라서 다음 루프타는 것이 가능함



[예외의 경우]


처음부터 검사위치 값과 맞지 않아서, 예외의 경우가 발생하는데

(우리는 한루프를 돌고나서 POS위치가 0이면 CROAK을 전부제거됬다고 정의했기때문) 이는 flag 변수를 설정해서 한번이라도 같은 것이 없는것도 -1이 되게 설정해준다.


코드)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<iostream>
#include<vector>
#include<string>
using namespace std;
char check[6= "croak"
vector <char> v; 
int main()
{
    int test_case;
    cin >> test_case;
    for(int t= 1; t<=test_case; t++)
    {
        bool flag = false;
        bool visit = false;
        int cnt = 0;
        int vsize = 0;
        int k = 0;
        int pos = 0;
        string str;
        cin >> str;
        int len = str.length();
        for (int i = 0; i < len; i++)
        {
            v.push_back(str[i]);
        }
     
        while (!v.empty())
        {
            vsize = v.size();
            k = 0// 만약 check와 같은 문자가 있으면 k 값으로 사이즈를 줄여주기위해서 필요함
            pos = 0;
            flag = false;
            visit = false;
            for (int i = 0; i < vsize - k; i++)
            {
                if (v[i] == check[pos])
                {
                    v.erase(v.begin() + i);
                    k++//size 하나 줄임
                    i--// i제자리 만들기위해 하나 빼줌
                    pos++// pos는 다음 뺄것을 준비하기위해 그위치로 이동
                    if (pos == 5)
                    {
                        pos = 0;// 다뺏으면 0으로 돌린후 다음 울음소리를 빼기위해 쎗팅!
                    }
                    visit = true// 이 문자는 있다.
                }
            }
            //한루프가 끝나면 pos 위치 확인
            if (pos != 0 || visit == false)
            {
                flag = true
                break;
            }
            cnt++
        }
        if (flag)
        {
            printf("#%d -1\n", t);
            v.clear();
        }
        else
            printf("#%d %d\n", t, cnt);
        }
    
}
cs


반응형

'PS > SWEA' 카테고리의 다른 글

2007번 패턴 마디의 길이  (0) 2018.10.16
1859번 백만 장자 프로젝트  (0) 2018.10.13
1926번 간단한 369게임  (0) 2018.10.05
1868번 파핑파핑 지뢰찾기  (0) 2018.09.30
SWEA - 혜리의 숫자 나누기  (0) 2018.09.23

+ Recent posts