개발자 일상/직장인도 코딩 테스트를 준비합니다

[프로그래머스] 유연근무제(Lv1) - (C++)에헤이.. 3년차가 이런 실수를!

파이어하고싶은임베개발자 2025. 7. 26. 10:00

[프로그래머스] LV1 : 2025 프로그래머스 코드챌린지 1차 예선 ::  유연근무제

 

실무에서 AUTOSAR 개발만 자꾸 딸깍하다 보니까..

감각을 너무 잃어버리는 것 같아서 프로그래머스에 복귀했습니다.

내가 한 실수들

1시간은 60분인데, 무지성 빼기를 함

음.. 시간을 100의단위로, 분을 1의 단위로 주니까 좋네
그냥 빼면 바로 시간 나오겠다!

8시 55분으로 schedule에 등록해놓고 9시 00분에 출근하면
900 - 855 = 45 > 10으로
임의 탈락처리!

안일하게 생각했다가 철퇴로 두들겨맞음

공유되지 않고 매 루프마다 초기화 되어야 하는 변수를 공유함

최적화 하겠다고 break 한거 까먹고 
일주일이니까 한바퀴 돌았네? → 그러면 그냥 변수 갱신 안하고 써도 되겠다
바로 철퇴로 두들겨맞음

정확히 어떤 일이 일어나고 있었는지 아래 TC로 알아봅시다
parameters   설명
schedules(int[]) [900, 930]  
timelogs(int[][]) [[900, 905, 910, 920, 930, 940, 950],
 [930, 931, 932, 940, 950, 935, 936]]
첫 번째 사람 : 월(940)/화(950) 지각으로 탈락
두 번째 사람 : 일(950)만 지각으로 포상 대상
startday(int) 3 수요일 시작
Return 1 한 명(두 번째 사람) 포상

day(루프변수) 0 1 2 3 4 5 6
첫 번째 사람
(현실)
n_startday(요일) 2(수) 3(목) 4(금) 5(토) 6(일) 0(월) 1(화)
늦은 시간 0분 5분 10분 20분 30분 40분 50분
판정 PASS PASS PASS PASS 미대상 FAIL
(정상)
-
두 번째 사람
(기대)
n_startday(요일) 2(수) 3(목) 4(금) 5(토) 6(일) 0(월) 1(화)
판정 PASS PASS PASS 미대상 미대상 PASS PASS
두 번째 사람
(현실)
n_startday(요일) 0(월) 1(화) 2(수) 3(목) 4(금) 5(토) 6(일)
늦은 시간 0분 1분 2분 10분 20분 5분 6분
판정 PASS PASS PASS PASS FAIL
(정상아님)
- -

?? : 파코야 집에 가고싶어?

자세한 풀이 흐름 기록

프로그래머스에 바로 보이는

"2025 프로그래머스 코드챌린지 1차 예선 - 유연근무제" 문제를 한번 풀어봤습니다.

 

레벨1 이면 간단하게 패스지! 하고 자신있게 아래 코드로 제출을 눌러봅니다.

틀린 풀이

더보기
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) {
    int answer = 0;
    int n_startday = startday - 1;
    
    for(int person=0; person<schedules.size(); person++)
    {
        int result = 1;
        for(int day=0; day<7; day++)
        {
            if(startday < 5)
            {
                int diff_h = timelogs[person][day] / 100 - schedules[person] / 100;
                int diff_m = timelogs[person][day] % 100 - schedules[person] % 100;
                int diff = diff_h * 60 + diff_m;
                if(diff > 10)
                {
                    result = 0;
                    break;
                }
            }
            n_startday = (n_startday + 1) % 7;
        }
        answer += result;
    }
        
    return answer;
}

어... 뭐가 문제지?

답답함에 체하기 전에 챗 지피티한테 물어봅니다.

지피티 : "야 임마! 서로 다른 케이스에서 변수가 초기화가 안 되고 공유되고있잖아!"
나 : 아;

니가 사람보다 낫다. 일단 나보다 나은건 확실해보이고

 

네, 너무 생각없이 관성적으로 짰더니 바로 철퇴맞았습니다.

중간에 break 구문 지나면 그 다음 요일부터 계산하고 있었던거죠.

 

아휴 답도없습니다. 3년차 C개발자도 이런 실수를 하네요.

3년이면 서당개도 풍월을 읊는다는데 그럼 저는 개만도 못한? 읍읍

??? : 개발-새발 개발하고 계시네요 파코님

 

그래서 한 줄 옮기니까 바로 모든TC 통과. 한심하다 나 자신!

모든 TC 통과한 풀이

더보기
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) {
    int answer = 0;
    // int n_startday = startday-1;  // 여기있던걸
    
    for(int person=0; person<schedules.size(); person++)
    {
        int result = 1;
        int n_startday = startday-1; //이리로 옮겨서 같은 요일로 시작
        for(int day=0; day<7; day++)
        {
            if(n_startday < 5)
            {
                int diff_h = timelogs[person][day] / 100 - schedules[person] / 100;
                int diff_m = timelogs[person][day] % 100 - schedules[person] % 100;
                int diff = diff_h * 60 + diff_m;
                if(diff > 10)
                {
                    result = 0;
                    break;           // 범인은 이 녀석
                }
            }
            n_startday = (n_startday + 1) % 7;
        }
        answer += result;
    }
        
    return answer;
}

 

사수에게 뚜들겨 맞기 좋은 코드 Ver

사수 : 파코님 왜 break 안했어요.
나 : 메모리.. 아끼려구요...

퍽퍽
더보기
#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) {
    int answer = 0;
    startday--;
    
    for(int person=0; person<schedules.size(); person++)
    {
        int result = 1;
        for(int day=0; day<7; day++)
        {
            if(startday < 5)
            {
                int diff_h = timelogs[person][day] / 100 - schedules[person] / 100;
                int diff_m = timelogs[person][day] % 100 - schedules[person] % 100;
                int diff = diff_h * 60 + diff_m;
                if(diff > 10)
                {
                    result = 0;
                }
            }
            startday = (startday + 1) % 7;
        }
        answer += result;
    }
        
    return answer;
}

 

🚨 교훈

  • break를 썼다면, 그 이후 상태 갱신이 제대로 되었는지 반드시 확인하자
  • 루프 바깥 변수 공유는 항상 위험 신호다 (특히 인덱스/상태 변수)
  • '레벨1 문제니까 대충 풀자' → 나중에 코드 보며 뺨 맞는 지름길

 

💭 후기

프로그래머스 Lv1 문제 하나 풀다 실무에서 개발하다 얻은 나쁜 습관을 몇 발견했습니다.
"실무 감각만 키우다 보면 기본기 녹슬 수 있다"는 말, 정말 실감나네요.

진짜 아무 생각 없이 “될 거 같아서” 짠 코드는,
언젠가는 반드시 "왜 이게 안 되지?"로 돌아옵니다.

이 글을 읽는 누군가가 같은 실수를 줄일 수 있다면…
그걸로 오늘 철퇴 맞은 보람은 충분합니다.

??? : 야 파코, 너 또 `n_startday` 밖에 두고 있지?

 

 

왜 백준으로 복귀하지 않았냐구요?

거긴 코드 테스트는 없고 코드 제출만 있어서 좀 불편해요...

 

여튼 오랜만에 푼 Lv1 문제.

안일하게 생각하다 개뚜들겨맞은 이야기였습니다.

반성하자 나 자신...