기본 로직은 큰돌님과 같이 1. 처음에 0 이 있다면 앞에서 모두 뺴기 2. 비교는 size -> String 각각 비교로 진행하였습니다. 위의 코드는 String 을 Array 로 받은 후, 직접 0을 걸렀고 밑의 코드는 내부에서 0을 걸렀습니답. 둘 다 예제나 스스로 만들어본 반례 모두 통과하는데, 위의 코드는 통과하고 밑의 코드는 실패해서 언어의 특성때문인지, 제가 놓치는 알고리즘적인 요소가 있는지 궁금해서 여쭤봅니다. * 그리고 혹시, 이렇게 다른 언어를 여쭤봐도 괜찮은가요 ..? 특히 Swift 로 다시 풀어볼 때 많이 틀리는 것 같아서 질문 올려봅니답 ㅠㅠ.. 통과코드 : var testCase = Int(readLine()!)! var result = [String]() var isZero = false while testCase > 0 { let input = Array(readLine()!) var integer = "" for i in 0 ..< input.count { if integer == "" && i != input.count - 1 && input[i] == "0" && (input[i + 1] >= "0" && input[i + 1] <= "9") { continue } if input[i] >= "0" && input[i] <= "9" { integer += String(input[i]) if i == input.count - 1 { result.append(integer) } else if input[i + 1] > "9" || input[i + 1] < "0" { result.append(integer) integer = "" } } } testCase -= 1 } result.sort{ (first, second) -> Bool in if first.count == second.count { return first < second } else { return first.count < second.count } } result.forEach{ print($0) } 실패코드: let N = Int(readLine()!)! var result = [String]() for _ in 0 ..< N{ let input = readLine()! var tempValue = "" for i in input.indices { switch input[i].asciiValue! { case Character("0").asciiValue! ... Character("9").asciiValue!: if i == input.index(before: input.endIndex) { while !tempValue.isEmpty && tempValue.first == "0" { tempValue.removeFirst() } result.append(tempValue + String(input[i])) continue } tempValue += String(input[i]) default: if tempValue == "" { continue } while !tempValue.isEmpty && tempValue.first == "0" { tempValue.removeFirst() } result.append(tempValue) tempValue = "" } } } result.sorted { $0.count == $1.count ? $0 < $1 : $0.count < $1.count }.forEach { print($0) }
문제는 BFS로 해서 잘풀었습니다 그런데 DFS로 해결하신거 듣고 궁금증이 들어 질문드립니다. DFS로 풀게되면 K가 최대인 2500일 경우 함수 깊이가 2500이 되지 않는건지 궁굼합니다. 분명 저는 스택에 제한이 있을거라고 생각하고 있는데 코딩테스트에서 DFS로 풀수 있는 함수콜 횟수 maximum 값을 얼마로 고려해야 하나요?
1-N: 1629 곱셈 문제 질문 드립니다. 테스트 코드는 잘 돌아가는 데 문제가 계속 틀렸다고 해서 질문 드립니다. 하기에 작성한 코드 링크 남겨두었습니다. 항상 좋은 가르침을 주셔서 감사합니다. http://boj.kr/17ebfc4a096343a6a592d0c3a16aa0a0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 주사위 윷놀이 문제 보고서 http://boj.kr/7a485f4fb46842189dc2ce91d1db7c91 이렇게 생각을 했는데, 처음 입력받은 이동 거리를 각 말로 이동해보고, 이동 장소에 가장 높은 숫자가 있는 말을 이동하려는 그런 방식으로 꾸미려 하던 중에 구현을 어떻게 해야할지 잘 떠오르지 않아 강의를 보았는데, 완전 다른 논리로 푸시는 걸 보고, 제가 생각한 방식에 대해 강사님의 생각을 들어보고 싶습니다. (아직 구현을 하다 말아서 코드가 다 있지 않은 점 양해 부탁드립니다..)
안녕하세요. 큰돌 선생님!! 강의 잘듣고 있는 학생입니다! 다름이 아니라, 선생님께서 알려주신 내용들을 바탕으로 저의 식대로 한번 짜보았는데요. 아래 코드를 백준에서 돌리면 결과는 잘 나오는데 틀렸다고 나오더라구요. 어디서 틀린건지 도저히 모르겠어서 질문드립니다. 코드는 선생님이 알려주신 내용 바탕으로 짠거라서 바로 아실꺼라고 생각합니다!! 답변 부탁드리겠습니다. 감사합니다. /* 문제 왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다. 아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오. 입력 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다. 출력 일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다. */ #include<bits/stdc++.h> using namespace std; vector<int> height; int sum_height = 0; const int total_height = 100; //난쟁이수, 일곱난쟁이키의 합 void printV(vector<int> &v) { vector<int> ::iterator iter; for(iter = v.begin(); iter != v.end(); iter++) { cout << *iter << "\n"; } } int main() { for(int i = 0; i < 9; i++) //난쟁이수는 9명 { int k; cin >> k; sum_height += k; height.push_back(k); } //cout << sum_height << endl; sort(height.begin(), height.end(), less<int>()); //printV(height); for(int i = 0; i < 9; i++) //난쟁이수는 9명 { for (int j = 0; j < i; j++) { if(height[i]+ height[j] == sum_height - total_height) { // cout << i << " "<< j<< " " << sum_height - total_height << endl; // cout << height[i] << " " << height[j] << endl; height.erase(height.begin() + i); height.erase(height.begin() + j); break; } } } printV(height); return 0; }
public int solution(int n) { int answer = 0, sum = 0, lt = 1; for(int rt=1; rt <= n/2+1; rt++) { sum += rt; if(sum == n) answer++; while(sum >= n) { sum -= lt++; if(sum == n) answer++; } } return answer; } 이렇게 해도 정답이 되었습니다. 문제가 풀리긴 했지만 좋은 답인지는 잘 몰라서 문의드립니다.
안녕하세요 항상 좋은 강의 잘 듣고 있습니다! 선생님께서 가르쳐주신 풀이 방식이 생각한대로 나름 직관적(?)이여서 다른 문제에서도 잘 사용하고 있는데 아무래도 재귀방식이다보니 시간복잡도에서 시간초과가 발생합니다. 이러한 DFS 방식에서 시간복잡도를 낮추는 방법이 있을까요? 또한 선생님께서는 이러한 문제 풀때 시간복잡도 관련해서 어떻게 해결하시나요?(예를들어 다른 풀이방식을 선호한다던지.. 등등)
안녕하세요 강사님 수업을 듣다가 궁금한 점이 생겨서 질문드립니다. while문의 조건이 lt<=rt: 인데 lt>rt가 되는 경우는 탐색이 완료되는 동안에는 없을것같아서 while문의 조건을 true로 하고 실행 시켜봤는데 채점프로그램을 돌려보면 오류가 발생합니다. true가 아니라 lt<=rt를 써야되는 이유가 어떤 상황일까요
http://boj.kr/2ee36f4f84574c92a5029deb708602c6 일반 가정 집과 치킨 집 좌표를 구해두고 거리를 구한 다음 y에는 가정집 기준, x에는 치킨집 기준의 거리를 2차원 vector d에 넣어줬습니다. 최소값을 구해야하기 때문에 같은 x의 y값( 즉, 치킨집을 기준으로 모든 집과의 거리)의 합을 구하여 v vector에 넣었습니다. v는 <치킨집번호, 총거리의합>으로 담았습니다. --> 이제 v[1].first에는 1번 치킨집이라는 정보, v[1].second에는 1번 치킨집과 모든 집과의 거리의 합이 들어가게 됩니다. v를 v.second(치킨집과 각 집의 총거리의 합)를 비교하는 함수로 sort하고 m만큼 반복(입력한 남아 있을 최대 치킨 집의 수) 가정집과 first(치킨집번호)에 해당하는 거리를 min 함수를 이용하여 최소값을 구한 뒤 ret에 더해줍니다. TC 모두 통과하기도 했고 논리적으로 오류가 없다고 생각했는데 틀렸다고 하여 반례 질문드립니다! 설명이 너무 장황했다면 죄송합니다ㅜ
안녕하세요 선생님, 매번 선생님 정답코드 보기전에 먼저 충분히 코딩해보고 안되면 정답보는 식으로 수업을 듣고있습니다. 이번 낚시왕 문제같은경우 상어가 움직이는 로직을 좀더 신경써서 나름 코딩을 했고, Test Case와 개시판 모든 반례들을 다 통과했는데, 제출하자마자 바로 틀렸다고 나오네요.. 제가 무엇을 놓치고 있는지 알려주시면 감사합니다. 선생님이 강의해주신 논리가 비슷한거같은데 제 코드는 제대로 계산하지 못한 반례가 있을까요..? http://boj.kr/504e729dba00420a807fdcc3a57d2fde 항상 좋은 강의 감사합니다 ㅠㅜ
p.108 Array의 요소 수정하기 함수에 매개변수로 전달할 때, 배열은 왜 int &a[] 형태가 아닌 int *a 로 전달해야하나요? 배열을 매개변수로 전달할때, int a[] | int a[size] | int *a 이렇게 세 가지 형태로 전달해서 수정이 가능하다면, 결국 배열은 참조로 전달 해야지만 값을 변경할 수 있는 다른 타입들과는 다르게 매개변수로 주어졌을 때 항상 값이 변할 수 밖에 없는건가요?
안녕하십니까, 큰돌님 코딩 테스트 강의를 수강하고 있는 박찬영 수강생입니다. 큰돌님 1-N: 1629 곱셈 문제 질문 드립니다. 테스트 코드는 잘 돌아가는 데 문제가 계속 틀렸다고 해서 질문 드립니다. 하기에 작성한 코드 링크 남겨두었습니다. https://www.acmicpc.net/submit/1629/54973440 항상 좋은 가르침을 주셔서 감사합니다.
안녕하세요 항상 강의 잘 듣고 있습니다. 5.합이같은 부분집합 문제에서 flag 변수를 이용해서 yes가 나오면 스택에 남아 있는 함수들만 호출되고 다른 재귀호출은 없이 끝내셨는데 혹시 아래 풀이에서와 같이 for, while의 반복문에서 break를 사용하면 불필요한 재귀호출 없이 끝낼 수 있나요? 아래 풀이는 프로그래머스 스킬트리 문제 풀이에서 발췌했습니다! for (let i = 0; i < skillTree.length; i++) { if ( mySkillSet.has(skillTree[i]) && skillTree[i] === mySkill[mySkillIndex] ) { mySkillIndex++; } else if (mySkillSet.has(skillTree[i])) { canSkill = false; break; } }
안녕하세요 좋은 강의 감사합니다. 수업 중 코드 작성 부분을 보면 #include <iostream>을 하지만 입력 함수로는 scanf 출력 함수로는 printf 를 사용하십니다. 혹시 왜 그런지 이유를 알 수 있을까요? C++로 작성한다면 cin, cout 등이 있음에도 왜 C에서 사용하는 입출력 스트림을 사용하는지 궁금합니다.