문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42578#
문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

종류이름
얼굴동그란 안경, 검정 선글라스
상의파란색 티셔츠
하의청바지
겉옷긴 코트

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항
  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예

clothesreturn
[[yellow_hatheadgear], [blue_sunglasseseyewear], [green_turbanheadgear]]5
[[crow_maskface], [blue_sunglassesface], [smoky_makeupface]]3


해결 방법)


한 4번정도 시도끝에 도저히 아이디어가 안떠올라서 힌트를 얻으러 돌아다녔다 


마침 이문제를 푼 사람을 발견했고, 그사람이 푼 과정을 보게 되었다. (감사합니당 알려주셔서 ㅎㅎ)

그런데 내가 멍청한건지 그 과정을 봐도 이해를한번에 하기 힘들었다.


그래도 푼 사람이니까 믿고 그 방법순서대로 그려가면서 이해해보려했다.

어 그러니까 이게 무슨일이지 그 방법대로하니까 모든 조합의 수가 나와버렸다 ....... 


그 방법은 예를 들어서 설명해보겠다.


example) 

배가 a, b, c 라는 이름의 3개가 있다.

귤은 e, f 라는 이름의 2개가 있다.


여기서 배는 안골랐다라는 경우를 포함해서 (0,a,b,c) 4개가 된다. 

마찬가지로 귤도 안골랐다라는 경우를 포함해서 (0,e,f) 3개가 된다.

이렇게 되면 4*3 =  12가지이고 여기서 0,0 인 둘다 안고르는 경우는 없기 떄문에 -1을 해주면 11가지로 답을 구할 수 있다.


종류를 하나 더 추가해서 보면


배 a,b,c 3개 

귤 e,f 2개

사과 g, h ,i 3개

이렇게 주어졌다고하고 위의 방법대로 하면,

(배 + 1) * (귤 + 1) * (사과 +1) -1 이 총 가지수가 된다.


저기 + 1은 그 종류를 안고른 경우가 되기때문에 모든 조합의 가지수가 나오게된다.


알고리즘 구성을 보면

입력받은 2차원 문자열 배열에서 같은 종류마다 있는 개수 정보를 저장한다.

그리고 그 개수마다 +1 씩해가며 모든 종류를 곱해준다. 

최종적으로 구해진 값에 -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
#include <string>
#include <vector>
int a[31= { 0, };
int v[31];
using namespace std;
 
int solution(vector<vector<string>> clothes) {
    int answer = 0;
    int size ;
    int ret = 1;
    size = clothes.size();
    for(int i =0 ;i<31; i++)
    {
        v[i] = 0;
    }
    for(int i = 0; i<size; i++)
    {
         if(v[i] == 1)
                continue;    
         for(int j = i ; j<size; j++)
         {
            if(clothes[i][1== clothes[j][1] )
            {
                a[i]++// i번째 종류 증가
                v[j]= 1;
            }
        }
    }
    for(int i = 0 ; i< 31; i++)
    {
        if(a[i]>0)
        {
            ret *= (a[i] +1);
        }
    }
    answer = ret - 1;
    return answer;
}
cs




반응형

오늘은 추석날이다.


나는 늦깍이 취준생이기때문에 쉬는날에도 공부를 해야한다.


스터디 같이 하는 사람이 있어서 아침부터 일찍 부랴부랴 준비하고 부천역에있는 드롭탑에 도착했다.


원래 같았으면 정말 여유롭게 밥먹고 티비 볼거좀 보고 핸드폰좀하다가 나와서 도서관에서 좀 딴짓하며 공부하는 패턴이었겠지만,


같이 하는 스터디 동생이 워낙에 부지런하고 열심히 공부했기때문에 의자에 앉자마자 모라도 생각하고 공부하려고 했다. 물론 리눅스에 웹서버 설치하는데 개뻘짓으로 시간 많이 날려먹엇지만ㅜㅜㅜㅜ(아직까지도 의문이다. 윈도우10에 wsl 이놈이 뭔지 몬르고 써서 그런가...)


도착하고서 카페분위기는 정말 평온하고 조용했다. 추석이라서 그런지 사람이 전혀없었다.. 


우리는 그렇게 열심히 몬가 하기는 했고,, 간단히 깁밥과 두유를 먹으면서 점심시간을 가졌다. 

(두유는 스터디동생이 줬는데 맛있었당 ㅋㅋㅋ , 그리구 두유먹으면서 본 매드클라운의 소년점프?? 이게핫하다해서 봣는데 ㅋㅋㅋ 솔직한 매드클라운의 모습이 인상깊었다. 이번 쇼미더머니에서 떨어진 깊은 빡침이 느껴졌다.)


점심 이후에는 아 오전에 뻘짓으로 좀 얻는게없는 시간을 보내서 그런지 오후에는 생활코딩에서 php 언어를 공부하면서 백엔드의 감만 익혀보았다. php는 html 동적으로 생성하고 바꾸기 때문에 생산성을 향상시키는 아주 좋은 기술이다. 이와 같은 언어로는 jsp, asp, node.js, python 등등이 있다고한다.


무튼 공부하고나서 부천역 근처에 어묵파는 포장마차쪽의 골목길을 들어가면 김밥천국이 보이는데 이곳 정말 숨은 밥집이다.

프랜차이즈점이라 여러 김밥천국이있지만 여기는 정말 인심이 넘치게 양을 많이 주는것같다. 다른데는 값은 비싸면서 양은 적은데 그거에 비하면 정말 좋다라고 생각한다. 물론 음식 맛도 맛잇다 조미료떄문인지 모르겠지만 ㅋㅋ 안들어가있는게어딨냐 솔직히 밖에서 파는 음식들가운데,,


지금 이글쓰고 있는 시각은 새벽인데 하.... 피곤하고 글쓰는것도 귀찮타 ㅋㅋ 이만 잘래 바이~

반응형

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

5년 뒤에 어떤모습이 될까?  (0) 2018.10.16
웹퍼블리셔 스터디한날  (0) 2018.10.16
알고리즘 잡스 상담후기  (8) 2018.09.30
내가 좋아하는것 찾는 방법  (0) 2018.09.04
첫번째 글입니다(테스트)  (0) 2018.08.31

캔디팡 문제 링크 : http://codeup.kr/JudgeOnline/problem.php?id=2605


해결 전략)


2차원 맵정보가 있는데 각 좌표마다 방문하면서 4방향(상,하,좌,우)에 인접해있는 모든 개수정보를 알고 결국, 인접해있는개수가 3개이상이면 카운팅을 해줘서 답을 구할수있다.

문제예시그림예를 들어서 그린 그림입니다.


여기서 인접해 있는 것이 보인다면 그 곳으로 좌표이동하고 다시 4방향으로 인접해 있는 개수정보를 파악한다.


이 작업을 모든 맵 좌표를 방문하면서 체크하게 된다. 단, 방문이 된 곳은 체크를 따로해줘서 재탐색이 이뤄지지 않도록 한다.


소스코드)

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
#include<stdio.h>
int map[8][8];
int visit[8][8];
int ret;
int cnt_ret;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,-1,1 };
int solve(int r, int l)
{
    // 4방향에서 현재숫자와 같은것을 비교하여 캔디팡이 터지는 영역을 카운팅 하는함수
    int tx, ty;
    int cnt =1 ;
    visit[r][l] = 1;
    for (int i = 0; i < 4; i++)
    {
        tx = r + dx[i];
        ty = l + dy[i];
        if (tx < 1 || tx > 7 || ty < 1 || ty >7)
        {
            continue;
        }
        else
        {
            if (!visit[tx][ty] && (map[tx][ty] == map[r][l]))
            {
                cnt += solve(tx, ty);
            }
        }
    }
    return cnt;
}
int main()
{
    for (int i = 1; i <= 7; i++)
    {
        for (int j = 1; j <= 7; j++)
        {
            scanf("%d"&map[i][j]);
        }
    }
    for (int i = 1; i <= 7; i++)
    {
        for (int j = 1; j <= 7; j++)
        {
            ret = solve(i,j);
            if (ret >= 3)
            {
                cnt_ret++;
            }
        }
    }
     
    printf("%d\n", cnt_ret);
}
 
cs


반응형

'PS > 코드업' 카테고리의 다른 글

3704번 계단 오르기 2  (0) 2019.03.31
1920번 2진수 변환 (재귀함수)  (0) 2019.03.16
3733번 우박수 길이 - large  (0) 2019.01.27
2606. 소수점 이하 출력  (0) 2018.12.17
재귀함수 1부터 n까지 합 구하기  (0) 2018.11.18

+ Recent posts