35일차 - 2022.04.04

안병욱·2022년 4월 4일
0

오늘 공부한 내용 요약

Baekjoon에서 문제풀이

1) 문제 : 현재 상근이가 설정한 알람 시각이 주어졌을 때, 알람을 45분 앞서는 시간으로 변환하는 프로그램을 작성하시오.
첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다. 입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.

풀이 (어제 푼 1번과 다른 방법으로 시도)
2. ? 이용

let H = Math.floor(parseInt(input[0]));
let M = Math.floor(parseInt(input[1]));


    if (M-45 >=0 ){
        console.log(`${H}` + " " + `${M-45}`);
    } else {
        H>=1 ? console.log(`${H-1}` + " " + `${M+15}`) :  console.log(23 + " " + `${M+15}`);
    }

2) 문제 : 훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.
첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)


고민과정
1번 문제와 달리 주어진 값에 변화주는 값이 고정적이지 않음.
C의 값을 시와 분으로 나눠주는 식과 그 식을 A와B에 더해주는 식 /
A가 23인경우 / B가 60이상인 경우 / A와B는 공백두고 주어짐

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');

let A = Math.floor(parseInt(input[0])); 
let B = Math.floor(parseInt(input[1]));
let C = Math.floor(parseInt(input[2]));
let d = Math.floor((B+C)/60);

if (A>=0 && A<=23 && B>=0 && B<=59 && C>=0 && C<=1000 ) {
    if(B + C <=59 ){
       console.log(`${A}` + " " + `${B+C}`);
       } else if (A+d<=23 && B + C >=60) {
        console.log(`${A+d}` + " " + `${(B+C)%60}`);          
       } else if (A+d >=24 && B+C >=60){
           console.log(`${A+d-24}` + " " + `${(B+C)%60}`);
       }
}

로 시도했으나 오답. if문은 맞는거 같은데 오류가 아닌 틀렸다고 나오는걸로 봐서 선언문쪽이 틀린걸로 의심.
그동안의 문제로 보아 입력값이 여러줄이면 input 선언시 split('\n')이고
공백있는 한줄이면 split(' ')으로 했는데 이번 문제는 2개의 혼합이므로

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');

let A = Math.floor(parseInt(input[0].split(' '))); 
let B = Math.floor(parseInt(input[1].split(' ')));

했으나 여전히 오답.



3) 문제 : 1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받음
같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받음
모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받음

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.
첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.
첫째 줄에 게임의 상금을 출력 한다.


고민과정
각각의 눈이 a,b,c라고 했을때 1<= a,b,c<=6 /

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split(' ');

let a = Math.floor(parseInt(input[0]));
let b = Math.floor(parseInt(input[1]));
let c = Math.floor(parseInt(input[2]));
let d = Math.max(a,b,c);

if (1<= a,b,c <= 6) {
    if (a==b && a==c && b==c) {
        console.log(`${10000+(a*1000)}`);
    } else if (a==b || b==c || a==c) {
    	console.log(`${1000+(a*100)}`);
    } else if (a !==b && a!==c && b!==c) {
        console.log(`${d*100}`);
    } 
}

시도했으나 오답. 이유를 고민해보니 첫번재 else if문에서 a,b,c 중 b,c가 같을수 있는데 같은눈의 값을 a로 단정지어 오답난 것으로 추정.


풀이
1. 비효율적이지만 나열해서 시도

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split(' ');

let a = Math.floor(parseInt(input[0]));
let b = Math.floor(parseInt(input[1]));
let c = Math.floor(parseInt(input[2]));
let d = Math.max(a,b,c);

if (1<= a,b,c <= 6) {
    if (a==b && a==c && b==c) {
        console.log(`${10000+(a*1000)}`);
    } else if (a !==b && a!==c && b!==c) {
        console.log(`${d*100}`);
    } else if (a==b && a!==c && b!==c){
        console.log(`${1000+(a*100)}`);
    } else if (a==c && a!==b && b!==c){
        console.log(`${1000+(a*100)}`);
    } else if (b==c && a!==b && a!==c){
        console.log(`${1000+(b*100)}`);
    }
}

  1. 같은눈이 2개인 경우 다르게 표현
if (1<= a,b,c <= 6) {
    if (a==b && a==c && b==c) {
        console.log(`${10000+(a*1000)}`);
    } else if (a !==b && a!==c && b!==c) {
        console.log(`${d*100}`);
    } else if (a-b ==0 && a!==c){
        console.log(`${1000+(a*100)}`);
    } else if (a-c ==0 && a!==b){
        console.log(`${1000+(a*100)}`);
    } else if (b-c ==0 && a!==b){
        console.log(`${1000+(b*100)}`);
    }
}

  1. 2번을 간소화
if (1<= a,b,c <= 6) {
    if (a==b && a==c && b==c) {
        console.log(`${10000+(a*1000)}`);
    } else if (a !==b && a!==c && b!==c) {
        console.log(`${d*100}`);
    } else if (a-b ==0){
        console.log(`${1000+(a*100)}`);
    } else if (a-c ==0){
        console.log(`${1000+(a*100)}`);
    } else if (b-c ==0){
        console.log(`${1000+(b*100)}`);
    }
}

if문 초반에 3개 모두 같거나 다른경우를 먼저 다뤘으므로 뒤의 else if의 내용에는 모두 같거나 다른내용 없으므로 간소화 가능하다고 생각.

  1. 3번풀이 한번더 간소화
if (1<= a,b,c <= 6) {
    if (a==b && a==c && b==c) {
        console.log(`${10000+(a*1000)}`);
    } else if (a !==b && a!==c && b!==c) {
        console.log(`${d*100}`);
    } else if (a-b ==0){
        console.log(`${1000+(a*100)}`);
    } else {
        console.log(`${1000+(c*100)}`);
    }
}

  • 32일차에 하기로 했던
    A >= -10000 && A <= 10000 && B > -10000 && B <= 10000 간소화를
    -10000 <= A,B <= 10000 으로 했으면 되는데 안된다고 생각해서 다른 방법을 찾고있었음. 의심하는건 좋은데 직접 더 실행해보아야 함.

내일 예정

  • 오븐구이 문제 해결
  • BaekJoon 그동안 문제 다른풀이 시도
  • readline 모듈 크게 이해

하루 돌아보며

아직 배울게 한창인데 새로운 내용 습득력이 좋지않은건 개선이 필요.
돌아서면 잊으니 한번더 직접 작성해보며 몸으로 기억할 필요가 있어보임
만족도 : ★☆☆☆☆

공부 출처

BaekJoon


위의 내용은 공부중 본인이 이해한 내용으로 몇몇 틀린 내용이 있을 수 있습니다.
회독중 발견시 수정하겠습니다

profile
working hard

0개의 댓글