반응형

폭풍울음

 아기를 보다보면 정말 귀신들린것처럼 울 때가 있습니다. 이 시기가 오면 할 수 있는 모든 방법을 동원해도 달래지지가 않습니다. 신생아를 보는게 처음이다보니 이렇게 강성울음을 쏟아내면 어쩔 줄을 모르겠더군요.

 

 저희는 출산 직후 24시간 모자동실을 해서 아기를 낳자마자 느껴볼 수 있었습니다. 낮에는 잠만 자서, 육아가 그렇게 힘들다더니 별거 없네라고 생각했는데, 밤이 되니 정말 해뜰때까지 울더군요. 할 수 있는 모든 걸 다해줘도 달래지지 않는데 너무 당황스러웠습니다. 또, 밤새도록 울다가 8시 쯤 가족들이 올때가 되니 귀신같이 울음을 그치고 곤히 자는게 참 당황스러웠습니다.

 

 조리원 퇴소 후 약 이주동안은 사흘에 한번 꼴로 주 2회 정도 찾아오는 것 같습니다. 이 시기가 찾아오면 저희 부부가 힘든게 문제가 아니고, 아기의 건강이 걱정될 정도로 웁니다. 12시간 가량을 잠도 자지 않고 강성울음을 쏟아내다가 간신히 달래주면 칭얼대고, 그 후 다시 강성울음이 반복됩니다. 신생아 적정 수면시간이 16~20시간이라는데, 한숨도 자지 않고 16시간을 울어재끼니 부모 입장에서는 정말 미칠 노릇입니다. 처음 당한 날은 저희 부부도 다음날 소아과를 가보기로 하고 주말에 여는 소아과까지 알아보았습니다. 내일 어떻게 하자고 계획을 다 세우니 귀신같이 울음을 그치더군요. 마치 문동은의 복수에 대한 전재준의 소감처럼 아기가 그만 울고 싶어질 때까지 몇시간이고 안아주고 달래주면서 당하는 수 밖에는 없습니다.(생후 한달이 조금 지난 지금 생각해보면 저 최악의 시기는 급성장기였던 것 같습니다. 지금은 저정도로 열몇시간씩 칭얼대지는 않습니다.)

 

막기엔 늦었고, 피할 수도 없겠고, 다 당해야 끝나는 건가?

 


그때는 맞고 지금은 틀리다

 다만, 그렇다고 부모된 입장에서 우는걸 보고만 있을수도 없는 입장이니 이런저런 시도들을 하게되고 가끔 한번씩 얻어걸리는 경우가 있습니다. 그럴때마다 ‘아! 이거였구나. 다음부터는 좀 쉽게 갈 수 있겠다.’ 라고 좋아하지만, 다음에 울 때 시도하면 먹혀들지 않습니다. 육아에 익숙해지면 아기 울음만 들어도 뭐가 필요한지 알게 된다고 하는데 저도 그렇게 될 수 있을까요.. 속사깨, 쪽쪽이, 코딱지 제거, 배마사지, 옆잠베개, 그냥 내버려두기 등 수많은 방법들을 찾았지만 여러번 연속으로 유효한 방법은 없는 것 같습니다. 다만 제가 쓸 수 있는 카드가 들어났다는 점에서는 의미가 있겠지요.

 

 처음에는 쪽쪽이, 옆잠 베개 등 사용이 권장되지는 않는 아이템들은 모두 사용하지 않으려고 했었으나, 아기의 울음에 무릎꿇었습니다. 쪽쪽이는 처음엔 먹히다가 요즘은 줘도 잘 안빨고, 옆잠 베개는 정말 잘 쓰고 있습니다.(라라스 만세 !) 그래도 쪽쪽이도 사나흘 정도 잘 썼습니다. 참고로 말씀드리면 영유아 1차 검진 때 완전 모유 수유시의 쪽쪽이 사용에 대해 여쭤봤었는데, 과도한 사용이 아니면 상관 없다고 합니다. 쥐콩이는 줘도 빨지 않게 되어버려서 저희는 고민할 필요도 없었던 거지만요..

 

 또한, 돌이켜 생각해보면 3주를 기점으로 울음에 변화가 생긴 것 같습니다. 3주 이전에는 뭔가 복통, 성장통이 울음의 주 원인이었다면, 3주 이후부터는 잠투정이 대부분이었던 것 같습니다. 뭔가 이때부터 저도 아기의 울음들이 조금식 구분이 되기 시작했던 것 같습니다. 사실 아기와 소통할 방법이 없으니 저의 오해일수도 있습니다만.. 아무튼 그렇습니다. 아기를 키우면서 가장 어려운게 이런 것 같습니다. 저도 아빠가 처음인지라 결국 돌이켜보면 이랬던 것 같다라는 식으로 후행적으로 깨닫게 되는데, 이 마저도 진짜 맞는지 알 수가 없지요… 이런저런 매체를 통해 공부한다고 해도 결국 육아라는게 케이스 바이 케이스 일테니까요. 매체는 우리 아이의 상태가 굉장히 유별나지는 않은 것 같다는 안도 정도의 의미만 있는 것 같습니다. 그래도 이런 경험들이 쌓이면서 혹시 아이가 어디가 안좋은 건 아닐까하는 막연한 공포는 조금씩 사라지는 것 같습니다.

 

 

 

반응형
반응형

문제풀이

1.  각 행을 탐색하며 첫번째 #과 마지막 #의 위치를 찾습니다. (ES 버전문제인지, 마지막 #의 위치는 findLastIndex() 함수가 사용되지 않아 reverse()를 이용하여 뒤집어서 찾았습니다.)

2. 행의 위치의 경우 #이 존재하는 첫번째 행과, 마지막행+1(드래그 때문)로 설정해줍니다.

 

JS Code

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
//https://school.programmers.co.kr/learn/courses/30/lessons/161990
function solution(wallpaper) {
    var answer = [-1,51,0,0];
    let rSize = wallpaper.length;
    let cSize = wallpaper[0].length;
    
    wallpaper.map(function(row, i){
        const tmp = row.split('');
        const min = tmp.findIndex((e) => e == '#');
        // findLastIndex 함수가 사용 안되서 뒤집어서 맨 뒤의 # 위치 찾기
        const maxTmp = tmp.reverse().findIndex((e) => e == '#');
        const max = (maxTmp != -1) ? cSize - maxTmp : -1
        
        if ( min != -1 && max != -1){
            if ( answer[0== -1 ){
                answer[0= i;
            }
            answer[2= i;
        }
        if ( min != -1 && min < answer[1] ){
            answer[1= min;
        }
        if ( max != -1 && max > answer[3]){
            answer[3= max;
        }
    })
    answer[2]++;
    return answer;
}
cs

 

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제풀이

1. 주어진 maps에서 S, L, E의 위치를 탐색합니다.

2. 다익스트라 알고리즘을 활용하여 S -> L, L ->E 까지의 최단시간을 탐색합니다.

3. S -> L, L -> E 모두 도달 가능한 경우, 두 시간을 합친 값을 반환합니다.

 

JS Code

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
//https://school.programmers.co.kr/learn/courses/30/lessons/159993
function solution(maps) {
    var answer = 0;
    let start = [0,0];
    let end = [0,0];
    let lever = [0,0];
    // S, L, E 좌표 탐색
    maps.map(function(row, i){
        let chk = 0;
        row.split('').map(function(r, j){
            if ( r == 'S' ){
                start = [i,j];
                chk += 1;
            }
            if ( r == 'E'){
                end = [i,j];
                chk += 1;
            }
            if ( r == 'L'){
                lever = [i,j];
                chk +=1
            }
            if ( chk == 3 ){
                return ;
            }
        })
        if ( chk ==3 ){
            return ;
        }
    })
    
    // S -> L 시간
    let a = dij(maps, start[0], start[1], lever[0], lever[1]);
    if ( a == 10001){
        return -1;
    }
    
    // L -> E 시간
    let b = dij(maps, lever[0], lever[1], end[0], end[1]);
    
    if ( b != 10001){
        return a+b;
    }else {
        return -1;
    }
}
 
// (r,c) -> (tr,tc) 걸리는 시간 반환
function dij(maps, r, c, tr, tc){
    let chk = Array.from(Array(maps.length), () => Array(maps[0].length).fill(0));
    let dist = Array.from(Array(maps.length), () => Array(maps[0].length).fill(10001));
    
    dist[r][c] = 0;
    
    let q = [[r,c]];
    while (q.length>0){
        let n = q.shift();
        if ( n[0]>0 && chk[n[0]-1][n[1]] == 0 && maps[n[0]-1][n[1]] != 'X'){
            dist[n[0]-1][n[1]] = Math.min(dist[n[0]][n[1]] + 1)
            chk[n[0]-1][n[1]] = 1;
            q.push([n[0]-1,n[1]]);
        }
        if ( n[0]<maps.length-1 && chk[n[0]+1][n[1]] == 0 && maps[n[0]+1][n[1]] != 'X'){
            dist[n[0]+1][n[1]] = Math.min(dist[n[0]][n[1]] + 1)
            chk[n[0]+1][n[1]] = 1;
            q.push([n[0]+1,n[1]]);
        }
        if ( n[1]>0 && chk[n[0]][n[1]-1== 0 && maps[n[0]][n[1]-1!= 'X'){
            dist[n[0]][n[1]-1= Math.min(dist[n[0]][n[1]] + 1)
            chk[n[0]][n[1]-1= 1;
            q.push([n[0],n[1]-1]);
        }
        if ( n[1]<maps[0].length-1 && chk[n[0]][n[1]+1== 0 && maps[n[0]][n[1]+1!= 'X'){
            dist[n[0]][n[1]+1= Math.min(dist[n[0]][n[1]] + 1)
            chk[n[0]][n[1]+1= 1;
            q.push([n[0],n[1]+1]);
        }
    }
    return dist[tr][tc]
}
cs

 

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제 풀이

1. dfs를 이용하여 cards1의 첫번째 요소와 goal의 첫번째 요소가 같은 경우, cards2의 첫번째 요소와 goal의 첫번째 요소가 같은 경우에 대하여 탐색합니다.

2. cards1[2]의 첫번째 요소와 goal의 첫번째 요소가 같은 경우는 cards1[2]과 goal의 첫번째 요소를 제거한 후에 다시 dfs를 호출해줍니다.

3. goal의 모든 요소가 제거되는 경우에는 'Yes'를, cards1과 cards2의 첫번째 요소 중 어느것도 goal의 첫번째 요소와 같지 않은 경우에는 'No'를 반환합니다.

 

JS Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//https://school.programmers.co.kr/learn/courses/30/lessons/159994
 
function solution(cards1, cards2, goal) {
    return dfs(cards1, cards2, goal);
}
 
function dfs(cards1, cards2, goal){
    if ( goal.length == 0){
        return 'Yes'
    }
    if ( cards1[0== goal[0]){
        return dfs(cards1.slice(1), cards2, goal.slice(1));
    }
    if ( cards2[0== goal[0]){
        return dfs(cards1, cards2.slice(1), goal.slice(1));
    }
    return 'No'
};
cs

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제 풀이

1. key는 keymap의 알파벳, value는 해당 알파벳의 인덱스의 최솟값으로 갖는 딕셔너리를 만듭니다.

2. targets의 target 별로 각 알파벳의 위의 딕셔너리의 value 값의 합을 answer에 넣습니다. 알파벳 중 하나라도 keymap에 없으면 -1을 answer에 넣습니다.

 

JS Code

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
function solution(keymap, targets) {
    let answer = [];
    
    // 알파벳 : 입력을 위한 최소 입력
    let dictObj = {};
    
    // 특정 알파벳을 입력하기 위한 키보드 최소 입력값
    keymap.forEach(keys => {
        keys.split('').map(function(k,i){
            if ( k in dictObj ){
                dictObj[k] = Math.min(dictObj[k], i+1);
            } else {
                dictObj[k]=i+1;
            }
        })
    })
    
    targets.forEach(target => {
        answer.push(count(dictObj,target));
    })
    
    return answer;
}
 
// 문자열 target을 작성하기 위해 필요한 키보드 입력 횟수 반환
function count(keymap, target){
    let answer = 0;
    for (t of target.split('')){
        if ( t in keymap ){
            answer += keymap[t];
        } else {
            return -1;
        }
    }
    return answer;
}
cs

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제풀이

1. 딕셔너리 자료형 c을 활용하여 보석의 종류 수를 셉니다. c[보석 종류 x] = i~j까지 있는 보석 중 보석 종류 x의 수

2. gems의 맨 앞 인덱스 j부터 보석을 체크합니다. (i는 0부터 시작합니다.)

2-1. c의 모든 value가 1 이상이 되어야 모든 보석 종류를 최소한 하나씩 사게 됩니다.

2-2. 2-1의 조건을 만족하기 시작하면 c[i번째 보석의 종류] > 1인 경우에는 i를 하나 증가시켜 줍니다. ( i번째 보석을 빼도 모든 종류의 보석을 살 수 있습니다.)

 

* 문제에서는 0이 아닌 1부터 시작하므로 i와 j는 1씩 더해서 계산해야합니다.

 

for 문이 한번 돌아가므로 시간 복잡도는 O(n)이 됩니다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def solution(gems):
    tmp = set(gems)
    # 각 보석이 몇 개 있는 지
    c = {}
    for t in tmp:
        c[t] = 0
    # 보석의 종류 수 
    check = 0
    # 보석의 전체 종류
    tot = len(tmp)
    i = 0
    answer = [0,len(gems)]
    for j, item in enumerate(gems):
        if c[item] == 0 : check += 1
        c[item] += 1
        while i < j and c[gems[i]] > 1 :
            c[gems[i]] -= 1
            i += 1
        if check == tot and j-< answer[1- answer[0]:
            answer = [i+1,j+1]
    
    return answer
cs

Line 19 : 모든 보석을 포함하며 이전보다 구간 길이가 줄어든 경우 answer를 i와 j로 바꿔줍니다.

문제 링크

 

코딩테스트 연습 - 보석 쇼핑

["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]

programmers.co.kr

 

반응형
반응형

문제풀이

1.  조합 함수(combination)을 활용하여 가능한 인덱스 조합을 만든다.

2.  각 행에서 1에서 뽑은 인덱스에 해당하는 값들만 추출하여 중복값이 없는지 찾는다. => 유일성

  (set에 넣어서 요소의 수를 총 행의 수와 비교한다.)

3.  각 단계에서 추출된 익덱스 집합이 이전에 선택된 인덱스 집합의 부분집합이 되는 경우는 없는지 확인한다. => 최소성

  (combination을 통해 추출한 조합의 인덱스 개수는 1부터 늘어남으로 이전에 선택된 인덱스 조합만 확인하면 된다.)

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from itertools import combinations
 
def solution(relation):
    rows = len(relation)
    cols = len(relation[0])
    keys = []
    
    for n in range(1,cols+1):
        for idxs in combinations(range(cols),n):
            # 최소성 and 유일성
            if min_check(keys,idxs) and \
                    len(set(tuple(relation[row][idx] for idx in idxs) for row in range(rows))) == rows :
                keys.append(idxs)
    
    return len(keys)
 
#최소성
def min_check(keys, target):
    for k in keys:
        if set(k).issubset(set(target)):
            return False
    return True
cs

문제 링크

 

코딩테스트 연습 - 후보키

[["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] 2

programmers.co.kr

 

반응형
반응형

문제풀이

1. 각 id가 신고한 id를 저장한다.

  a[id] = [신고한 id, ...]

2. 각 id가 신고당한 횟수를 저장한다.

  c[id]=id가 신고당한 횟수

3. 각 id가 신고한 id a[id] 의 요소들 x 중 신고당한 횟수 c[x] 가 기준값 k를 넘는 요소 x의 수를 반환한다.

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#https://programmers.co.kr/learn/courses/30/lessons/92334?language=python3
def solution(id_list, report, k):
    # 신고 당한 횟수
    c = {}
    # 신고한 id
    a = {}
    
    for i in id_list:
        c[i] = 0
        a[i] = []
    
    for r in set(report):
        #x가 y를 신고
        x, y = r.split()
        c[y] += 1
        a[x].append(y)
        
    return [sum(1 if c[t] >= k else 0 for t in a[i]) for i in id_list]
cs

 

문제링크

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

반응형

+ Recent posts