[프로그래머스] 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 문제.
안일하게 생각하다 개뚜들겨맞은 이야기였습니다.
반성하자 나 자신...
'개발자 일상 > 직장인도 코딩 테스트를 준비합니다' 카테고리의 다른 글
[프로그래머스] 비밀 코드 해독(Lv2) - (C++)백트래킹 문제는 포기 조건 검사가 종료 히트 보다 먼저! (4) | 2025.07.27 |
---|