대망의 오늘의 첫 문제 그냥 포스팅 하면서 푸는 과정 한단계식 올리고 어떻게 풀었는지 쓰는편이 쓰기 더 편할 것 같아서 좀 어렵다고 느낀 문제는 풀고 난 뒤에 올리려고 한다. (사실 level 0 문제 푸는데 이게 어려운 나님이 레전드) 아무튼 오늘 처음 문제다.
정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
class Solution {
public int solution(int n) {
int sum = 0;
for (int i = n; i >= 1; i-=2) { // 반복문 선언
if (i % 2 == 0) { //짝수 검증
sum += n; // 값 더하기
}
}
return sum;
}
}
처음엔 이런식으로 풀어내려고 했다가 곰곰이 생각 해보니까 굳이 짝수를 검증할 필요가 없다는 걸 느꼈다. (애초에 저거 정답도 아니다 왜 틀리게 나오는지도 잘 이해 안된다.. 아무튼 테스트 케이스에서 내가 원하는 값을 주지 않아서 고민했다.)
for문에 2씩 더하면서 n값까지 도달하게 만든다면, 그리고 i 값에 n 값을 넣은 것 자체가 멍청한 짓이였다는 것도 깨닫고 i 에는 정수 2를 넣어주고 2씩 더하면서 n값까지 도달하거나 초과하면 for문이 멈추도록 코드를 싹 지우고 새로 고쳤다.
class Solution {
public int solution(int n) {
int sum = 0;
for (int i = 2; i <=n; i += 2) { //2에 2씩 더하면 짝수 밖에 나오지 않음.
sum += i; // i 값을 더하면서 sum에 저장 ==> 2 + 4 + --- n 도달.
}
return sum; // sum값을 리턴
}
}
이렇게 하니까 문제는 풀렸다.
다음!
//정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을
// return 하도록 soltuion 함수를 완성해주세요.
class Solution {
public int solution(int num1, int num2) {
int x = num1 / num2;
int y = x * 1000;
return y;
}
}
간단한 문제인 줄 알았다. 이래서 한국말은 제대로 읽어봐야한다.
//입출력 예 #1
//num1이 3, num2가 2이므로 3 / 2 = 1.5에 1,000을 곱하면 1500이 됩니다.
//입출력 예 #2
//num1이 7, num2가 3이므로 7 / 3 = 2.33333...에 1,000을 곱하면 2333.3333.... 이 되며, 정수 부분은 2333입니다.
//입출력 예 #3
//num1이 1, num2가 16이므로 1 / 16 = 0.0625에 1,000을 곱하면 62.5가 되며, 정수 부분은 62입니다.
자 이제 다시 고민 시작이다 일단 위에 내가 짠 코드를 테스트 케이스에 넣으면 당연히 통과하지 않는다.
순서대로 보면 1500이 아닌 1000, 2333이 아닌 2000, 62가 아닌 0을 리턴 값으로 갖는다.
정수 값을 실수 값으로 전환하는 방법을 검색해볼까?
문자열 형변환이라는 코드가 있다 이걸 활용해 봐야겠다!
class Solution {
public int solution(int num1, int num2) {
float x = (float) num1; // -> num1 값 실수형으로 x에 넣음
float y = (float) num2; // -> num2 값 실수형으로 y에 넣음
float z = (x / y)*1000; // -> 문제에서 요구한 식
int i = (int) z; // -> z값 i에 정수 값으로 넣기
return i;
}
}
이렇게 썼더니 i 값에 노란 줄이 뜨길래 클릭하니까
class Solution {
public int solution(int num1, int num2) {
float x = (float) num1; // -> num1 값 실수형으로 x에 넣음
float y = (float) num2; // -> num2 값 실수형으로 y에 넣음
float z = (x / y)*1000; // -> 문제에서 요구한 식
return (int) z; // z 값을 리턴 하는데 정수로 리턴할거야.
}
}
더 보기 좋게 바꾸어주었다. 일단 테스트 케이스로 검증부터 해봐야겠다.
오케이 검증 통과 이제 문제 제출해보면,, 정답이다. 비교적 빨리 해결 했다.
이렇게 오늘 문자열 형변환을 알게 되었다.
다음 문제.
//머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다.
// 정수 n과 k가 매개변수로 주어졌을 때, 양꼬치 n인분과 음료수 k개를 먹었다면 총얼마를 지불해야 하는지
// return 하도록 solution 함수를 완성해보세요.
class Solution {
public int solution(int n, int k) { // 양꼬치 = n , 음료수 = k
int nP = 12000; // -> 양꼬치의 가격
int kP = 2000; // -> 음료의 가격
int nn = nP * n; // -> 양꼬치의 총 가격
int sK = 0; // -> 서비스 음료 개수 세려고 변수 선언
for (int i = 1; i <= n; i+= 10){ // -> 10인분 마다 서비스 음료 하나 추가
sK++; // -> 서비스 음료 카운트
}
int t = k - sK; // 변수 t에 음료 개수에 서비스 음료 빼기
int kk = kP * t; // 계산할 음료 값 계산
return nn + kk; // 양꼬치 값 음료 값 더한 총 결제량 리턴.
}
}
이렇게 풀고 테스트 케이스 실행 해 봤는데 양꼬치를 10인분 이상 19인분 이하로 시켰을 때의 가격만 맞았다. 다시 말하면 9이하 20이상일 때 음료값이 2000원씩 모자르다.
그러니까 코드가 어딘가 잘못 되었다는건데.. 어디가 잘못된거지. 일단 생각을 좀 해봐야 될 것 같다.
곧바로 해결할 수 있는 코드를 추가해보면
class Solution {
public int solution(int n, int k) { // 양꼬치 = n , 음료수 = k
int nP = 12000;
int kP = 2000;
int nn = nP * n;
int sK = 0;
for (int i = 1; i <= n; i += 10) {
sK++;
}
int t = k - sK;
int kk = kP * t;
int x = nn + kk;
if (n <= 9 || n >= 20){ // -> 위의 경우에는 2000을 더한다.
x +=2000;
}
return x;
}
}
테스트 케이스는 다 통과 해서 얼핏 해결된 것 같아 보이긴한데 난 절대 이게 정답은 아닐 거라는 생각에 n = 20을 넣는 테스트 케이스를 넣어봤다. 2000원이 많네? if문을 주석 처리 하고 실행해보니까 20 30들은 2000원이 많아서 테스트 케이스를 통과하지 못하고 나머지 아까 위에 서술한 경우에는 2000원이 모자르다. 그럼 또 자바한테 만약 n 값이 10 초과의 10의 자리라면 -4000을 해달라는 코드를 써 넣으면 정답이 될까?
궁금하니까 해보자.
class Solution {
public int solution(int n, int k) { // 양꼬치 = n , 음료수 = k
int nP = 12000;
int kP = 2000;
int nn = nP * n;
int sK = 0;
for (int i = 1; i <= n; i += 10) {
sK++;
}
int t = k - sK;
int kk = kP * t;
int x = nn + kk;
if (n <= 9 || n >= 20){
x +=2000;
}
if (n >= 20 && n <= 1000 && n % 10 == 0){ //20부터 10의 배수인 경우에 작동
return x -=4000; // 그럼 x값 -4000한 값 리턴
}
return x;
}
}
이렇게 꼼수를 부려서 정답 제출 하니까 검증에서 딱 하나 틀려서 통과는 못했다. 틀린 하나의 경우의 수가 뭔지 찾으면 문제 자체는 맞출 수 있을 것 같은데 아마 출제자의 의도는 이런 코드가 아닌게 확실하다.. 싹 지우고 처음부터 다시 생각해봐야겠다.
그리고 변수가 많아지니까 헷갈린다. 변수명도 귀찮긴한데 그냥 제대로 써야겠다.
아 생각해보니까 서비스 받은 음료 개수가 꼭 반복문을 써서 샐 필요가 없었다. 그냥 서비스 음료 변수만들어서 n 값을 10으로 나누면 서비스 받은 음료 개수가 나오겠구나. 코드 작성하고 와야겠다.
class Solution {
public int solution(int n, int k) { // 양꼬치 = n , 음료수 = k
int nPrice = 12000; // 양꼬치의 가격
int kPrice = 2000; // 음료의 가격
int nOderPrice, kCount, kSrvCount, kOderPrice;
// 양꼬치 총 가격 계산
nOderPrice = n * nPrice;
//서비스 음료 개수 계산
kSrvCount = n / 10;
int kk = kSrvCount - k;
kOderPrice = kk * kPrice;
return nOderPrice + kOderPrice;
}
}
중간에 뭐가 빠졌는지 테스트 케이스에서 값이 좀 빈다. 중간에 뭐가 빠졌나보다.. 뭐가 빠진거지. 그와중에 하나는 통과 했다. n값이 64 k 값이 6인 경우인데, 음 전체적으로 테스트 케이스를 통과하지 못한 경우는 다 전체 가격이 모자르다. 그런데 딱 맞은 경우는 서비스 음료만 먹었을 경우니까 뭔가 빼기에 문제가 있는 것 같다.
class Solution {
public int solution(int n, int k) { // 양꼬치 = n , 음료수 = k
int nPrice = 12000; // 양꼬치의 가격
int kPrice = 2000; // 음료의 가격
int nOrderPrice, kCount, kSrvCount, kOrderPrice;
// 양꼬치 총 가격 계산
nOrderPrice = n * nPrice;
// 서비스 음료 개수 계산
kSrvCount = n / 10;
// 실제로 지불해야 하는 음료 개수
kCount = k - kSrvCount;
if (kCount < 0) {
kCount = 0; // 음료 개수가 음수가 될 경우엔 0으로 계산
}
// 음료 총 가격 계산
kOrderPrice = kCount * kPrice; // 실제 지불해야 하는 음료 개수를 사용
return nOrderPrice + kOrderPrice;
}
}
이 코드 작성했는데 테스트 케이스 하나에 계속 문제가 떠서 계속 고치다가 이상해서 보니까 테스트 케이스 값을 잘못 써놨더라. 이 코드가 맞는 것 같다. 오늘도 긴 여정이였다.. 이제 깃 업로드 하고 집 가서 쉬어야겠다.
오늘도 좋은 하루 보내시길.
'Coding History' 카테고리의 다른 글
2024. 06. 07 기본 개발용어 알아보기 (1) | 2024.06.07 |
---|---|
2024. 06. 07 문제 풀이 (1) | 2024.06.07 |
2024. 06. 06 객체지향 프로그래밍이 뭔가요? - 얄팍한 코딩사전 (0) | 2024.06.06 |
국비 지원 IT(웹앱개발) 취업반 강의 7일차 (2) | 2024.06.05 |
국비 지원 IT(웹앱개발) 취업반 강의 6일차 (0) | 2024.06.04 |